用逗号分隔的标签列表拆分数据框列

时间:2020-02-12 16:55:24

标签: r dataframe tidyr data-cleaning

我正在处理带有标签特征的产品数据集。就是说,它们具有一个属性,该属性包含在逗号分隔的单词列表中。例如,

text = textfeldEingabe.get('1.0', 'end').strip()
text = str(text)
print(text)
text = bytes(text.encode())
print(text)
startEntschluesselung = False
try:
    dEntschluesselung = int(entryPrivaterKey.get())
    nEntschluesselung = int(entryNEntschluesselung.get())
    startEntschluesselung = True
except:
    messagebox.showerror('Eingabefehler', 'Geben Sie für n, Blocklaenge und private Key ganze Zahlen ein')

if startEntschluesselung:
    textEntschluesselt = verschluesseln(text, (dEntschluesselung, nEntschluesselung))
    textfeldAusgabe.config(state='normal')
    textfeldAusgabe.delete('1.0', 'end')
    textfeldAusgabe.insert('1.0', textEntschluesselt)
    textfeldAusgabe.config(state='disabled')

我想将标签列分为每个标签的不同逻辑列,即

data.frame(
   id = c(11, 12, 13),
   tags =c("wood,small,old","big,iron,artistic", "pretty,wood")
)

我尝试使用| id | wood | iron | small | big | old | artistic | pretty | ------------------------------------------------------------ | 11 | TRUE| FALSE| TRUE| FALSE| TRUE| FALSE| FALSE| | 12 | FALSE| TRUE| FALSE| TRUE| FALSE| TRUE| FALSE| | 13 | TRUE| FALSE| FALSE| FALSE| FALSE| FALSE| TRUE| 包中的separate函数,但是标记是无序的,因此很难为每个标记创建一列。

我找到了一种使用tidyr包中的mutate并为每个标签手动创建一列的解决方案,

dplyr

但是新标签可能会在将来出现,我希望使其具有可扩展性。

¿有什么方法可以轻松做到吗?

2 个答案:

答案 0 :(得分:4)

您可以这样做:

select s.geom.sdo_srid, count(*)  
from objekt_stup s  
group by s.geom.sdo_srid ;  

以R为基数,它需要一些步骤:

library(tidyverse)
df %>% 
   separate_rows(tags) %>%
    mutate(val = TRUE) %>%
    spread(tags, val, FALSE)
      id artistic   big  iron   old pretty small  wood
    1 11    FALSE FALSE FALSE  TRUE  FALSE  TRUE  TRUE
    2 12     TRUE  TRUE  TRUE FALSE  FALSE FALSE FALSE
    3 13    FALSE FALSE FALSE FALSE   TRUE FALSE  TRUE

答案 1 :(得分:0)

我们可以使用cSplit_e中的splitstackshape创建一个二进制列,然后通过删除前缀来rename

library(splitstackshape)
library(dplyr)
library(stringr)
cSplit_e(df1, 'tags', sep=",", type = 'character', fill = 0, drop = TRUE) %>%
    mutate_at(-1, as.logical) %>%
    rename_at(-1, ~ str_remove(., 'tags_'))
#  id artistic   big  iron   old pretty small  wood
#1 11    FALSE FALSE FALSE  TRUE  FALSE  TRUE  TRUE
#2 12     TRUE  TRUE  TRUE FALSE  FALSE FALSE FALSE
#3 13    FALSE FALSE FALSE FALSE   TRUE FALSE  TRUE

或更紧凑

library(qdapTools)
cbind(df1[1],  mtabulate(strsplit(as.character(df1$tags), ",")))