我有一个包含100个变量和400,000个事务的大型数据集。这是一个示例数据:
a <- structure(list(ID = c("A1", "A2", "A3", "A1", "A1", "A2", "A4", "A5", "A2", "A3"),
Type = c("A", "B", "C", "A", "A", "A", "B", "B", "C", "B"),
Alc = c("E", "F", "G", "E", "E", "E", "F", "F", "F", "F"),
Com = c("Y", "N", "Y", "N", "Y", "Y", "Y", "N", "N", "Y")),
.Names = c("ID", "Type", "Alc", "Com"), row.names = c(NA, -10L), class = "data.frame")
a
ID Type Alc Com
1 A1 A E Y
2 A2 B F N
3 A3 C G Y
4 A1 A E N
5 A1 A E Y
6 A2 A E Y
7 A4 B F Y
8 A5 B F N
9 A2 C F N
10 A3 B F Y
我喜欢这样的数据集:
ID Type_A Type_B Type_C Alc_E Alc_F Alc_G Com_Y Com_N
A1 3 0 0 3 0 0 2 1
A2 1 1 1 1 2 0 1 2
A3 0 1 1 0 1 1 2 0
A4 0 1 0 0 1 0 1 0
A5 0 1 0 0 1 0 0 1
我在'reshape2'包中使用'dcast'功能。但结果不符合我的要求。
提前致谢。
答案 0 :(得分:5)
假设您的data.frame
是DF:
require(reshape2)
dcast(melt(DF, id.var=c("ID")), ID ~ variable + value, value.var="value")
Aggregation function missing: defaulting to length
ID Type_A Type_B Type_C Alc_E Alc_F Alc_G Com_N Com_Y
1 A1 3 0 0 3 0 0 1 2
2 A2 1 1 1 1 2 0 2 1
3 A3 0 1 1 0 1 1 0 2
4 A4 0 1 0 0 1 0 0 1
5 A5 0 1 0 0 1 0 1 0
答案 1 :(得分:2)
由于您似乎只是根据a$ID
将每列列入表格,因此您也可以在table
中使用lapply
,如下所示:
do.call(cbind, lapply(a[-1], function(x) table(a[[1]], x)))
# A B C E F G N Y
# A1 3 0 0 3 0 0 1 2
# A2 1 1 1 1 2 0 2 1
# A3 0 1 1 0 1 1 0 2
# A4 0 1 0 0 1 0 0 1
# A5 0 1 0 0 1 0 1 0
名称不是很漂亮,但很容易定制lapply
命令来解决这个问题:
do.call(cbind,
lapply(names(a[-1]), function(x) {
temp <- table(a[[1]], a[[x]])
colnames(temp) <- paste(x, colnames(temp), sep = "_")
temp
}))
# Type_A Type_B Type_C Alc_E Alc_F Alc_G Com_N Com_Y
# A1 3 0 0 3 0 0 1 2
# A2 1 1 1 1 2 0 2 1
# A3 0 1 1 0 1 1 0 2
# A4 0 1 0 0 1 0 0 1
# A5 0 1 0 0 1 0 1 0