R语言按ID分组求和物种列 保留同组固定列无需手动指定列名
解决方案
方案1:tidyverse(dplyr)实现(推荐,代码更易读)
利用dplyr的列选择器可以批量匹配所有sp开头的列,同时因为同一ID的temp值完全一致,直接将temp加入分组变量即可保留原始值,不需要额外处理:
library(dplyr) result <- df %>% # 按ID和temp分组,同一ID的temp值一致,不影响分组逻辑 group_by(ID, temp) %>% # 对所有sp开头的列执行求和 summarise(across(starts_with("sp"), sum), .groups = "drop")
运行后得到的结果和预期完全一致:
# A tibble: 2 × 5 ID temp sp1 sp2 sp3 <chr> <dbl> <dbl> <dbl> <dbl> 1 a 36.5 25 7 4 2 b 32 35 11 6
如果还有其他和temp一样、同一ID取值完全一致的变量需要保留,直接加进group_by的参数里即可。
方案2:base R 实现
用正则表达式批量匹配所有sp开头的列,同样将temp加入分组条件:
# 批量匹配所有sp开头的列名 sp_cols <- grep("^sp", names(df), value = TRUE) # 按ID+temp分组,对所有sp列求和 result <- aggregate(. ~ ID + temp, df[, c("ID", "temp", sp_cols)], sum)
运行结果:
ID temp sp1 sp2 sp3 1 a 36.5 25 7 4 2 b 32.0 35 11 6
方案说明
两种方案都不需要手动逐个指定sp列名,哪怕有上千个sp开头的物种列都可以自动识别处理:
- 利用前缀匹配规则批量选中需要求和的物种列
- 不需要求和、同一ID取值唯一的变量直接加入分组条件,即可保留原始值,不会被聚合计算
- 自动过滤A这类无意义的非目标列
内容的提问来源于stack exchange,提问作者CuriousDude
相关产品推荐
相关产品推荐

