如何在dplyr的group_by管道中求和时排除指定值?
分组计算时排除特定记录的正确实现
直接上可用的代码:
library(dplyr) # 定义要排除的名称列表 exclude <- c("R2-D2","Luke","Darth") grouped2 <- starwars %>% group_by(species) %>% summarise( # 仅对不在排除列表的记录求和,同时处理缺失值 Total_Mass = sum(mass[name !%in% exclude], na.rm = TRUE), # 所有记录参与均值计算,同样处理缺失值 Average_Height = mean(height, na.rm = TRUE) )
为什么你的写法不对?
你在sum里用where的语法不符合dplyr的规则,summarise里的计算逻辑需要针对单个变量做筛选,而不是用where整行过滤。通过mass[name !%in% exclude]这种逻辑索引,就能精准提取符合条件的mass值再求和,不会影响其他计算项。
额外提醒
加上na.rm = TRUE是必须的——starwars数据集里mass和height存在缺失值(NA),如果不处理,只要分组里有一个NA,求和或均值结果就会变成NA,完全失去参考价值。
备选方案(当所有计算都要排除同一批记录时)
如果你的所有分组计算都需要排除这些记录,也可以先过滤再分组,代码更简洁:
grouped3 <- starwars %>% filter(!name %in% exclude) %>% group_by(species) %>% summarise( Total_Mass = sum(mass, na.rm = TRUE), Average_Height = mean(height, na.rm = TRUE) )
内容的提问来源于stack exchange,提问作者plast1cd0nk3y
相关产品推荐
相关产品推荐

