假设有一个非常简单的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
发布于 2016-12-23 15:13:00
这里有一种使用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
发布于 2016-12-23 15:20:40
我们可以使用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
类作为输入。
发布于 2016-12-23 14:46:55
您想要存储数据的方式根本没有效率,因为您将创建一个疯狂的数量的列,其值大部分时间都会丢失。
相反,请看一下https://github.com/juliasilge/tidytext和unnest_tokens
函数。
https://stackoverflow.com/questions/41303110
复制相似问题