将包含不同长度的多个逻辑要素的字符列拆分为单独的逻辑列

时间:2018-03-22 00:03:02

标签: r dataframe

我有一个正在处理的数据集,其中一列包含多个以逗号分隔的功能。每个观察中的特征数量各不相同。

df <- data.frame(x=c("a", "a,b,c", "a,c", "b,c", "", "b"))

 x
1       a
2   a,b,c
3     a,c
4     b,c
5      
6       b

我想将其拆分为多个逻辑列,如下所示:

  a b c
1 1 0 0
2 1 1 1
3 1 0 1
4 0 1 1
5 0 0 0
6 0 1 0

其中每列代表观察是否在原始列中包含该字符串。怎么能实现这一目标?有没有办法在不指定输出列的情况下执行此操作?例如,如果观察包含:

,该怎么办?
"a,b,d"

如何以捕获原始列的所有独特功能的方式执行此操作?

2 个答案:

答案 0 :(得分:1)

首先将每个项目拆分为列表verification并计算唯一级别s。然后使用levs创建所需的矩阵outer并添加列名称。

tab

,并提供:

s <- strsplit(as.character(df$x), ",")
levs <- unique(unlist(s))
tab <- outer(s, levs, Vectorize(function(x, y) y %in% x)) + 0
colnames(tab) <- levs

答案 1 :(得分:0)

d=strsplit(as.character(df$x),",")
> m=xtabs(z~x+y,data.frame(x=rep(df$x,lengths(d)),y=unlist(d),z=1))
> as.data.frame.matrix(m)
      a b c
      0 0 0
a     1 0 0
a,b,c 1 1 1
a,c   1 0 1
b     0 1 0
b,c   0 1 1