在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
相关产品推荐
相关产品推荐

