将列标记为虚拟列

Tags column to dummy columns

想象一个非常简单的 csv 文件,如下所示:

output,input,tags
0,0,sunday-hot
1,3,sunday
5,1,hot-random

其中标签列由一系列关键字组成,所有关键字均以“-”分隔。
我想要的是将其变成如下所示的数据集:

output,input,sunday,hot,random
0,0,T,T,F
1,3,T,F,F
5,1,F,T,T

您想要存储数据的方式根本没有效率,因为您将创建疯狂 数量的列,这些列的值大部分时间都会丢失。

相反,请查看 https://github.com/juliasilge/tidytextunnest_tokens 函数。

这是使用 dplyr/tidyr 的一种方法。使用 separate_rows() 将粘贴的 tags 列分隔为普通列,该列在每个单元格中包含一个值;创建一个包含所有 TRUEvalue 列;用 FALSE:

填充缺失值
library(dplyr); library(tidyr)

df %>% separate_rows(tags) %>% 
       mutate(val = TRUE) %>% 
       spread(tags, val, fill = FALSE)

#  output input   hot random sunday
#1      0     0  TRUE  FALSE   TRUE
#2      1     3 FALSE  FALSE   TRUE
#3      5     1  TRUE   TRUE  FALSE

我们可以使用 mtabulate

的单行代码来做到这一点
library(qdapTools)
cbind(df1[-3], mtabulate(strsplit(df1$tags, "-"))!=0)
#   output input   hot random sunday
#1      0     0  TRUE  FALSE   TRUE
#2      1     3 FALSE  FALSE   TRUE
#3      5     1  TRUE   TRUE  FALSE

注意:如果 "tags" 列是 factor class,请将其用 as.character 包裹起来,因为 strsplit 只需要 character class 作为输入