R:在同一data.frame中组合行

时间:2013-11-20 12:28:54

标签: r matrix row

我有一个简单的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

3 个答案:

答案 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)