R:合并同一data.frame中的行[重复]

Posted

技术标签:

【中文标题】R:合并同一data.frame中的行[重复]【英文标题】:R: Combine rows in same data.frame [duplicate] 【发布时间】:2013-12-04 10:48:30 【问题描述】:

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

非常感谢!

问候丽桑

【问题讨论】:

【参考方案1】:
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,那么在这些函数之后,您可能想要执行dat[!(dat %in% c(1,0)] &lt;- 1 之类的操作。

【讨论】:

+1 比我的好多了。【参考方案2】:

未提及的一种可能性是聚合函数。我认为这是相当“可读”的。

aggregate(cbind(data$X1, data$X2, data$X3, data$X4), 
by = list(category = data$group), FUN = sum)

【讨论】:

【参考方案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 是您的数据框的名称。

【讨论】:

感谢 Sven,这个答案对我有用! :)

以上是关于R:合并同一data.frame中的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

合并具有相同 ID 变量的行 [重复]

合并数据框中的行[重复]

根据条件从 r 中的多列中删除重复的行

重复data.frame的行[重复]

在R中的data.frame中聚合一个轴[重复]

在过滤R data.frames时更新因子水平[重复]