将单元格转换为共同名称

时间:2017-01-12 18:12:52

标签: r dataframe reshape2

我的数据框的例子是:

> df
n   b    c    d
A Eeee Aaaa     
B Aaaa Bbbb Jjjj
C Jjjj Cccc     
D Aaaa Dddd  

我想将单元格的值转换为唯一的名称,并使用二进制值填充数据框,因此生成的数据框将如下所示:

> resulting_df
n   Aaaa Bbbb Cccc Eeee Jjjj
A    1    0    0    1    0
B    1    1    0    0    1
C    0    0    1    0    1
D    0    0    0    0    0

我确信应该有一个简单的方法来实现这个没有循环。请帮忙。

1 个答案:

答案 0 :(得分:4)

reshape2可以做到这一点:
数据:

df=structure(list(n = structure(1:4, .Label = c("A", "B", "C", "D"
), class = "factor"), b = structure(c(2L, 1L, 3L, 1L), .Label = c("Aaaa", 
"Eeee", "Jjjj"), class = "factor"), c = structure(1:4, .Label = c("Aaaa", 
"Bbbb", "Cccc", "Dddd"), class = "factor"), d = structure(c(NA, 
1L, NA, NA), .Label = "Jjjj", class = "factor")), .Names = c("n", 
"b", "c", "d"), class = "data.frame", row.names = c(NA, -4L))

library(reshape2)
dcast(melt(df,id.vars = "n"),n ~value,fun.aggregate = length)

给出了:

  n Aaaa Bbbb Cccc Dddd Eeee Jjjj NA
1 A    1    0    0    0    1    0  1
2 B    1    1    0    0    0    1  0
3 C    0    0    1    0    0    1  1
4 D    1    0    0    1    0    0  1

然后您可以取消选择最后一列。

我们的想法是将melt()数据转换为长格式,然后根据您的需要使用dcast()重新制作。 使用fun.aggregate=length以便用于填充数据帧的值对应于出现的次数。