如何用dplyr对前n个观测值外的数值进行部分聚合(求和)
用dplyr实现Top N之外数据的聚合
这里提供两种实用的dplyr方案,帮你完成需求:
方案一:单管道流实现(简洁高效)
直接在一条dplyr管道里完成排序、标记分组、汇总的全流程:
library(dplyr) # 原始数据 id <- c("aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj") value <- c(10, 9, 8, 7, 6, 5, 4, 3, 2, 1) df <- data.frame(id, value) n <- 5 df_new <- df %>% arrange(desc(value)) %>% mutate(id_new = if_else(row_number() <= n, id, "others")) %>% group_by(id_new) %>% summarise(value_new = sum(value), .groups = "drop") %>% arrange(match(id_new, c(df$id[1:n], "others"))) print(df_new)
步骤说明:
arrange(desc(value)):按value降序排序,确保前n行是数值最大的项mutate(...):用行号判断,前n个id保留原样,其余统一标记为othersgroup_by + summarise:按新的分组标识求和,.groups = "drop"清除分组状态arrange(...):调整输出顺序,让top n的id保持原顺序,others放在最后
方案二:拆分步骤实现(逻辑清晰)
把提取top N、聚合剩余数据、合并结果拆分开,更易理解:
library(dplyr) # 原始数据 id <- c("aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj") value <- c(10, 9, 8, 7, 6, 5, 4, 3, 2, 1) df <- data.frame(id, value) n <- 5 # 提取top n的数据并调整列名 top_n_data <- df %>% top_n(n, value) %>% arrange(desc(value)) %>% rename(id_new = id, value_new = value) # 聚合剩余数据为others others_data <- df %>% anti_join(top_n_data, by = c("id" = "id_new")) %>% summarise(id_new = "others", value_new = sum(value)) # 合并结果 df_new <- bind_rows(top_n_data, others_data) print(df_new)
步骤说明:
top_n(n, value):直接筛选出数值最大的前n条数据,排序后调整列名匹配最终格式anti_join:找出不在top n里的剩余数据,求和后标记为othersbind_rows:将top n数据和聚合后的others合并成最终数据框
两种方法都能得到你需要的df_new,可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者vog
相关产品推荐
相关产品推荐

