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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:36:31