我有一个正在处理的数据集,其中一列包含多个以逗号分隔的功能。每个观察中的特征数量各不相同。
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"
如何以捕获原始列的所有独特功能的方式执行此操作?
答案 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