You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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保留原样,其余统一标记为others
  • group_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里的剩余数据,求和后标记为others
  • bind_rows:将top n数据和聚合后的others合并成最终数据框

两种方法都能得到你需要的df_new,可以根据自己的习惯选择。

内容的提问来源于stack exchange,提问作者vog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:25:21