我的数据框的例子是:
> 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
我确信应该有一个简单的方法来实现这个没有循环。请帮忙。
答案 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
以便用于填充数据帧的值对应于出现的次数。