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)] <- 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中的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章