想象一个非常简单的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
答案 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/tidytext和unnest_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