首页 > 解决方案 > R,按ID分组并按组中的值对列求和而不调用列名?

问题描述

我在 stackoverflow 上看到了几个答案,它们确实显示了如何使用聚合和汇总来获取按列分组后的列总和。但是,它们似乎都依赖于实际写出列名,因此我很难将这些解决方案应用于我的问题。具体来说,我需要最小化我的数据框,以便按 ID 分组,临时(和其他变量)在同一个 ID 中是相同的,所以我需要保持这些值相同,并按 ID 对每个物种的列求和(即把它们的值加起来)。

df <- tibble(A = c(1,2,3,4,5,6), temp=c(36.5,36.5,36.5,32,32,32), ID= c('a','a','a','b','b','b'), sp1=c(5,10,10,15,15,5), sp2=c(0,2,5,0,6,5), sp3=c(1,1,2,2,3,1))

我已经尝试过聚合的版本,但我不知道如何为许多列(我有 100 种物种)做到这一点,而且我不知道如何不合并其他变量,如温度。

aggregate(. ~ ID, df, sum)

   ID  A  temp sp1 sp2 sp3
1  a  6  109.5  25   7   4
2  b  15  96.0  35  11   6

显然不正确。我想要的输出如下,我什至可以忽略像 A 这样的列,这只是 ID 的一个额外值(但这并不重要)。

   ID  temp   sp1 sp2 sp3
1  a   36.5    25   7   4
2  b   32      35  11   6

我也试过:

aggregate(cbind(sp1,sp2,sp3) ~ ID, df, FUN=sum)

  ID sp1 sp2 sp3
1  a  25   7   4
2  b  35  11   6

这让我更接近,但我仍然不知道如何保持 temp 列不变,我不知道如何让它需要大量的物种。我有时有从 sp1 到 sp1000 的表...

标签: r

解决方案


这能得到你想要的吗?

library(dplyr)
df %>%
  select(-A) %>% 
  group_by(ID, temp) %>% # all "common to each group" vars
  summarise(across(everything(), sum), .groups = "drop")


# A tibble: 2 x 5
  ID     temp   sp1   sp2   sp3
  <chr> <dbl> <dbl> <dbl> <dbl>
1 a      36.5    25     7     4
2 b      32      35    11     6

推荐阅读