我有一个简单的R问题,但我找不到答案。 我有这样的数据框:
A 1 0 0 0 0 0
B 0 1 0 0 0 0
B 0 0 1 0 0 1
B 0 0 0 0 1 0
C 1 0 0 0 0 0
C 0 0 0 1 1 0
我希望它就像这样:
A 1 0 0 0 0 0
B 0 1 1 0 1 1
C 1 0 0 1 1 0
非常感谢!
关心Lisanne
答案 0 :(得分:4)
dat <- structure(list(V1 = structure(c(1L, 2L, 2L, 2L, 3L, 3L), .Label = c("A",
"B", "C"), class = "factor"), V2 = c(1L, 0L, 0L, 0L, 1L, 0L),
V3 = c(0L, 1L, 0L, 0L, 0L, 0L), V4 = c(0L, 0L, 1L, 0L, 0L,
0L), V5 = c(0L, 0L, 0L, 0L, 0L, 1L), V6 = c(0L, 0L, 0L, 1L,
0L, 1L), V7 = c(0L, 0L, 1L, 0L, 0L, 0L)), .Names = c("V1",
"V2", "V3", "V4", "V5", "V6", "V7"), class = "data.frame", row.names = c(NA,
-6L))
你可以......
aggregate(.~ V1 , data =dat, sum)
或
library(plyr)
ddply(dat, .(V1), function(x) colSums(x[,2:7]) )
如果你正在处理有data.frame
的重复项,但你只想要注意是否存在1
,那么在这些函数之后你可能想要做类似的事情{ {1}}。
答案 1 :(得分:3)
这是使用tapply
的一种可能性:
cbind(unique(dat[1]), do.call(rbind, tapply(dat[-1], dat[[1]], colSums)))
# V1 V2 V3 V4 V5 V6 V7
# 1 A 1 0 0 0 0 0
# 2 B 0 1 1 0 1 1
# 5 C 1 0 0 1 1 0
其中dat
是数据框的名称。
答案 2 :(得分:1)
未提及的可能性是聚合函数。我觉得这很“可读”。
aggregate(cbind(data$X1, data$X2, data$X3, data$X4),
by = list(category = data$group), FUN = sum)