【发布时间】:2015-09-20 08:35:51
【问题描述】:
我有一个看起来像这样的数据集:
Type Age count1 count2 Year Pop1 Pop2 TypeDescrip
A 35 1 1 1990 30000 50000 alpha
A 35 3 1 1990 30000 50000 alpha
A 45 2 3 1990 20000 70000 alpha
B 45 2 1 1990 20000 70000 beta
B 45 4 5 1990 20000 70000 beta
我想在 Type 和 Age 列中添加匹配的行数。所以理想情况下,我最终会得到一个如下所示的数据集:
Type Age count1 count2 Year Pop1 Pop2 TypeDescrip
A 35 4 2 1990 30000 50000 alpha
A 45 2 3 1990 20000 70000 alpha
B 45 6 6 1990 20000 70000 beta
我尝试过使用嵌套的duplicated() 语句,如下所示:
typedup = duplicated(df$Type)
bothdup = duplicated(df[(typedup == TRUE),]$Age)
但这会返回年龄或类型重复的索引,不一定是当一行有两个重复时。
我也试过tapply:
tapply(c(df$count1, df$count2), c(df$Age, df$Type), sum)
但是这个输出很难处理。完成后我想要一个 data.frame 。
我不想使用 for 循环,因为我的数据集非常大。
【问题讨论】:
-
如果您有许多列要分组和求和,请参阅stackoverflow.com/questions/30669817/…
-
@Frank 我认为 必须 是这个问题的副本 - 但我没有找到任何完美的匹配。这个问题有两个分组变量,这使得它与您链接的那个不同。
-
@SamFirke 对我的口味来说差异不够大:) 无论如何,重要的区别不是两个分组变量,而是两列相加。如果只有一个,那么 OP 的
tapply几乎可以“工作”(至少在给出正确数字的意义上,尽管不在 data.frame 中)。 -
我认为您的 TypeDescript 将是预期输出中第二行的测试版。试试
df2 %>% group_by(Type, Age,Pop1, Pop2, TypeDescrip) %>% summarise_each(funs(sum), matches('^count'))