R语言按分组变量条件实现数据框汇总的技术问题
解决R中按条件分组汇总的问题
问题分析
你遇到的报错是因为if语句只能处理标量条件(长度为1的逻辑值),而分组内a == 'A'返回的是长度等于分组行数的向量,导致条件长度大于1的错误。另外,原代码中cbind会将所有列转为字符型,b列无法正常求和,需要先修正数据类型。
解决方案
以下是满足需求的完整代码:
- 首先修正数据类型(避免
cbind导致的类型转换问题):
a<-c('A', 'A', 'A', 'B', 'B', 'C', 'C') b<-c(1,2,3,4,5,6,7) c<-c('a1', 'a1', 'b2', 'a1', 'b2', 'a1', 'a1') # 直接用data.frame创建,保证b列是数值型 df <- data.frame(a, b, c)
- 按条件分组汇总:
library(dplyr) df1 <- df %>% group_by(a, c) %>% summarize( b = case_when( # 分组中a为'A'时直接求和 cur_group()$a == 'A' ~ sum(b), # 非A分组:若b只有唯一值则取该值,否则求和 n_distinct(b) == 1 ~ unique(b), TRUE ~ sum(b) ), .groups = "drop" # 取消分组状态 ) print(df1)
输出结果
a b c 1 A 3 a1 2 A 3 b2 3 B 4 a1 4 B 5 b2 5 C 13 a1
关键说明
cur_group()$a:获取当前分组的a值,返回标量,彻底解决条件长度大于1的问题。n_distinct(b):统计分组内b的唯一值数量,实现“唯一值取单值、多值求和”的逻辑。- 用
data.frame()直接创建数据,避免cbind自动将数值列转为字符型的坑。
内容的提问来源于stack exchange,提问作者user21508369
相关产品推荐
相关产品推荐

