基于ID聚合观测值求和生成新变量的R实现方法
解决方法
你的代码有两个核心问题:
- 用了
mutate而非summarise:mutate会保留分组后的所有行并新增列,而你需要把每个ID的多行压缩成一行,必须用summarise。 starts_with用法错误:这个函数一次只能接受一个前缀参数,不能直接传多个前缀。
下面是两种可行的修正方案:
方案一:用正则表达式匹配多前缀
用正则表达式^[FTB]匹配所有以F、T、B开头的列,代码如下:
aggregated_df3 <- aggregated_df2 %>% group_by(ID) %>% summarise(across(matches("^[FTB]"), ~ sum(.x, na.rm = TRUE)), .groups = "drop")
方案二:组合多个starts_with选择器
把多个starts_with用c()组合起来,实现多前缀匹配:
aggregated_df3 <- aggregated_df2 %>% group_by(ID) %>% summarise(across(c(starts_with("F"), starts_with("T"), starts_with("B")), ~ sum(.x, na.rm = TRUE)), .groups = "drop")
额外补充:对ID外所有列求和
如果你的需求是对除ID之外的所有列求和(无需指定前缀),可以直接写:
aggregated_df3 <- aggregated_df2 %>% group_by(ID) %>% summarise(across(-ID, ~ sum(.x, na.rm = TRUE)), .groups = "drop")
说明:.groups = "drop"用来在聚合后取消分组状态,避免后续操作出现分组相关的问题。
内容的提问来源于stack exchange,提问作者T Kalin
相关产品推荐
相关产品推荐

