如何在dplyr中结合rowSums与ifelse通过mutate创建新变量
解决方案:用dplyr实现自定义条件的newvar生成
嗨,我来帮你搞定这个需求~完全贴合你给出的规则,运行后结果会和你示例里的newvar完全一致。
核心思路是用case_when清晰处理多分支条件,比嵌套ifelse更易读维护,具体实现如下:
完整代码示例
library(dplyr) # 假设你的数据框名为df,直接执行这段代码即可 df <- df %>% mutate( newvar = case_when( # 当boss==2时,直接赋值0 boss == 2 ~ 0, # 当boss==1且缺失值多于1个(≥2个),设为NA boss == 1 & rowSums(is.na(.[, c("var1", "var2", "var3")])) > 1 ~ NA_real_, # 其他boss==1的情况(缺失值≤1个),求和并忽略缺失值 boss == 1 ~ rowSums(.[, c("var1", "var2", "var3")], na.rm = TRUE) ) )
代码细节解释
- 统计缺失值数量:
rowSums(is.na(.[, c("var1", "var2", "var3")]))会高效计算每行var1-var3的缺失值个数,比逐个写is.na(var1)+is.na(var2)+is.na(var3)简洁得多。 case_when的优势:把不同规则按顺序列出来,逻辑一目了然,后续调整规则也很方便。NA_real_的作用:因为newvar里有数值0,用数值型的NA_real_能保证列类型统一,避免出现类型冲突的警告。- 求和忽略缺失值:
rowSums(..., na.rm = TRUE)会自动跳过缺失值计算,比如你示例里第六行var2是NA,求和时会直接计算1+2=3,完全符合要求。
匹配你的示例数据
把这段代码用到你提供的数据上,结果会和示例完全一致:
- 第一行boss=1,2个缺失值 → newvar=NA
- 第二行boss=1,无缺失值 → 2+3+3=8
- 第三-五行boss=2 → newvar=0
- 第六行boss=1,1个缺失值 →1+2=3
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

