r - 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 的表...
解决方案
这能得到你想要的吗?
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
推荐阅读
- firebase - 如何在 Firebase 规则中公开用户帖子
- solr - Solr 搜索 8.4.1 未找到结果
- powerbi - 将列从一个表添加到另一个表
- java - 我将如何删除在 Java 中用户使用 ArrayLists 声明的索引之前(而不是之后!)的索引?
- javascript - 从一个文件中读取 XML 和 JS
- amazon-web-services - Aws MediaConvert - 创建一个具有单个音轨和多个视频输入的输出视频文件
- xml - PostgreSQL xpath - 按日期条件
- javascript - Bootstrap v4 datetimepicker 不工作(Tempus Dominus)
- c# - 如何确定视图中按钮的来源?
- sql - sql server SELECT 在死锁之前等待多长时间