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

在R中按自定义分组条件汇总数据并生成新变量

解决R语言自定义分组汇总并生成新变量的需求

我来帮你搞定这个数据聚合需求,用dplyr包来实现会非常直观简洁,下面是完整的步骤和代码:


步骤1:准备数据与分组定义

首先创建你的虚拟数据集,注意别用list当变量名(这是R的内置函数名,容易引发冲突),我们改成group_list:

# 安装并加载dplyr包(如果还没安装的话)
if (!require(dplyr)) {
  install.packages("dplyr")
  library(dplyr)
}

# 创建虚拟数据集
df <- data.frame(
  Order = "Order1",
  Condition = c("P", "A", "B", "C", "D", "E", "F"),
  Value = c(500, -10, -5, 0, 0, -10, 0)
)

# 定义分组列表
group_list <- list(
  Group1 = c("A", "B"),
  Group2 = c("C", "D"),
  Group3 = c("E","F")
)

步骤2:实现分组汇总与格式转换

我们需要完成几个核心操作:提取"P"的数值、计算每个分组的Value总和、统计分组内Value非0的有效行数(匹配你期望输出里的计数逻辑),最后把结果整合成目标格式:

# 处理数据并生成结果
result <- df %>%
  # 先标记出P对应的数值
  mutate(P = ifelse(Condition == "P", Value, NA)) %>%
  # 按Order分组(后续扩展多Order场景也适用)
  group_by(Order) %>%
  summarise(
    # 提取P的数值
    P = first(na.omit(P)),
    # 计算各分组的Value总和
    Group1 = sum(Value[Condition %in% group_list$Group1], na.rm = TRUE),
    Group2 = sum(Value[Condition %in% group_list$Group2], na.rm = TRUE),
    Group3 = sum(Value[Condition %in% group_list$Group3], na.rm = TRUE),
    # 统计各分组中Value≠0的行数
    Group1n = sum(Condition %in% group_list$Group1 & Value != 0, na.rm = TRUE),
    Group2n = sum(Condition %in% group_list$Group2 & Value != 0, na.rm = TRUE),
    Group3n = sum(Condition %in% group_list$Group3 & Value != 0, na.rm = TRUE)
  ) %>%
  # 取消分组状态
  ungroup()

# 查看最终结果
print(result)

运行代码后会得到和你期望完全一致的输出:

# A tibble: 1 × 7
  Order   P Group1 Group2 Group3 Group1n Group2n Group3n
  <chr> <dbl>  <dbl>  <dbl>  <dbl>   <int>   <int>   <int>
1 Order1   500    -15      0    -10       2       0       1

补充说明

  • 如果你的计数需求是分组内的总元素个数(不管Value是否为0),只需要把计数代码里的& Value != 0去掉即可,比如Group1n = sum(Condition %in% group_list$Group1, na.rm = TRUE)。
  • 这段代码支持多Order场景,只要你的原始数据有多个Order值,会自动按每个Order单独汇总。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:49:35