将列标记为虚拟列
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/tidytext 和 unnest_tokens
函数。
这是使用 dplyr/tidyr 的一种方法。使用 separate_rows()
将粘贴的 tags 列分隔为普通列,该列在每个单元格中包含一个值;创建一个包含所有 TRUE 的 value 列;用 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 作为输入
想象一个非常简单的 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/tidytext 和 unnest_tokens
函数。
这是使用 dplyr/tidyr 的一种方法。使用 separate_rows()
将粘贴的 tags 列分隔为普通列,该列在每个单元格中包含一个值;创建一个包含所有 TRUE 的 value 列;用 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 作为输入