如何在R数据框中汇总行并保留分组变量第二次出现的字符值?
用dplyr实现分组求和并保留指定字符值
针对你的需求——按Season分组,对Number列求和,同时保留每个分组中第二次出现的Character值(分组仅一行时保留该行值),可以用以下两种dplyr方案解决:
首先确保加载dplyr包:
library(dplyr)
方案一:直接在summarize中指定提取规则
通过判断分组内的行数,明确Character的取值逻辑:
df %>% group_by(Season) %>% summarize( Number = sum(Number), # 分组有2行及以上取第2个值,只有1行就取唯一值 Character = ifelse(n() >= 2, nth(Character, 2), first(Character)) ) %>% ungroup()
方案二:先算总和再取目标行
考虑到你示例中第二次出现的行正好是分组的最后一行,也可以先计算组内Number的总和,再提取每个分组的最后一行:
df %>% group_by(Season) %>% mutate(Number_total = sum(Number)) %>% slice_tail(n = 1) %>% # 取分组最后一行 select(Season, Number = Number_total, Character) %>% ungroup()
运行任意一种方案后,都会得到符合预期的结果:
Season Number Character <chr> <dbl> <chr> 1 Fall 4 s 2 Summer 1 1s 3 Spring 9 q 4 Winter 6 1s
如果需要和你示例完全一致的行顺序,可在末尾加上arrange(match(Season, c("Summer", "Fall", "Winter", "Spring")))调整顺序。
之前用summarize处理非数值列出问题,是因为默认情况下summarize需要明确的聚合规则,上面的方法通过指定Character的提取逻辑,完美解决了这个问题。
内容的提问来源于stack exchange,提问作者Noah_Seagull
相关产品推荐
相关产品推荐

