将列标记为虚拟列

时间:2016-12-23 14:19:25

标签: r dplyr tidyr

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

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

其中tags列由一系列以“ - ”分隔的关键字组成。
我想要的是把它变成一个看起来像这样的数据集:

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

3 个答案:

答案 0 :(得分:3)

我们可以使用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

注意:如果"标签"列是factor类,用as.character包裹,因为strsplit只接受character类作为输入

答案 1 :(得分:1)

您希望存储数据的方式效率不高,因为您会创建疯狂数量的列,其值大多数时间都会丢失。

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

答案 2 :(得分:1)

以下是使用 dplyr / tidyr 进行此操作的一种方法。使用separate_rows()将粘贴的标记列分隔为普通列,其中每个单元格中包含一个值;创建一个列,其中包含要传播的所有 TRUE ;使用 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