R语言分组后多列条件判断新增列及保留原列问题求助
问题解决:按分组判断变量条件并新增列
需求说明
在给定的dataframe中,按household和individual分组后,若每组内所有行的X_1、Y_2、Z_3三个变量均大于0,则给该组所有行的新增列criteria赋值为"C1",否则赋值为0;已知仅household 1001 - individual 1满足该条件。同时需保留分组外的其他变量(如year、week、duration)不变。
用户尝试的错误代码
data %>% group_by(household,individual) %>% mutate(criteria = ifelse(X_1 >0 & Y_2 >0 & X_3 >0,"C1",0)) # option_2 data %>% group_by(household,individual) %>% select_at(vars(X_1 >0 & Y_2 >0 & Z_3 >0,"C1",0),all_vars(.>0)) %>% mutate(criteria = "c1")
样本数据集
data <- data.frame(household=c(1001,1001,1001,1001,1001,1002,1002,1002,1003,1003,1003), individual = c(1,1,1,1,1,2,2,2,1,1,1), year = c(2021,2021,2022,2022,2022,2021,2022,2022,2022,2022,2022), week =c("w51","w52","w1","w2","w4","w51","w1","w3","w1","w2","w3"), duration =c(20,23,24,56,78,12,34,67,87,89,90), X_1 = c(3,3,3,3,3,0,0,0,1,1,1), Y_2 = c(2,2,2,2,2,1,1,1,0,0,0), Z_3 = c(4,4,4,4,4,0,0,0,0,0,0))
错误原因分析
- 第一种方法:
ifelse是逐行判断,不符合“整组所有行满足条件”的需求;且写错了变量名(把Z_3写成了X_3)。 - 第二种方法:
select_at是用于筛选变量的函数,不能用来判断分组条件,逻辑完全错误。
正确解决方案
使用dplyr的分组功能结合all()函数,判断整组是否满足条件后统一赋值:
library(dplyr) data_processed <- data %>% group_by(household, individual) %>% # 检查分组内所有行的三个变量是否都大于0,统一赋值 mutate(criteria = ifelse(all(X_1 > 0 & Y_2 > 0 & Z_3 > 0), "C1", 0)) %>% ungroup() # 无需保留分组时可取消分组
代码解释
all(X_1 > 0 & Y_2 > 0 & Z_3 > 0):在每个分组内,验证所有行的三个变量是否均大于0,返回单个逻辑值(TRUE/FALSE)。ifelse()根据上述逻辑值,给当前分组的所有行的criteria列统一赋值:满足条件则为"C1",否则为0。- 所有原有变量会被完整保留,符合需求。
运行后,仅household=1001且individual=1的所有行criteria为"C1",其余组均为0,完全符合预期。
内容的提问来源于stack exchange,提问作者joy_1379
相关产品推荐
相关产品推荐

