R语言数据框中用ifelse/case_when统计代码数量的问题
解决定性编码数据集非NA编码计数问题
针对你需要统计每行Code1到Code4中非NA编码数量的需求,这里提供几种简单高效的实现方法,同时帮你分析之前代码的问题:
方法一:用rowSums快速实现(最推荐)
这是最简洁的写法,利用!is.na()把非NA值转为逻辑值TRUE(对应数值1),NA转为FALSE(对应数值0),再用rowSums对每行求和,直接得到非NA的数量:
# 基础R写法 df$count <- rowSums(!is.na(df[, c("Code1", "Code2", "Code3", "Code4")])) # dplyr管道写法 df <- df %>% mutate(count = rowSums(!is.na(across(c(Code1, Code2, Code3, Code4)))))
方法二:用dplyr行级操作实现
如果需要更灵活的行级计算,可以用rowwise()配合c_across()实现:
df <- df %>% rowwise() %>% mutate(count = sum(!is.na(c_across(Code1:Code4)))) %>% ungroup() # 记得取消行分组,避免影响后续的批量操作
你之前代码的问题分析
ifelse写法的问题
你分步用ifelse赋值的逻辑完全错误:每次赋值都会覆盖上一次的结果,而且只是单独判断某一个变量是否为NA,根本没有统计所有非NA变量的总数,自然无法得到正确结果。
case_when写法的问题
你的case_when有两个致命错误:
- 最后一行
xor(Code1,Code2)没有遵循条件 ~ 结果的双边公式格式,这是导致报错的直接原因。 - 逻辑错误:case_when是按顺序匹配第一个满足的条件就返回结果,你的写法是只要Code1非NA就返回1,不管其他变量有没有值,这不是统计总数,而是判断单个变量是否存在,完全不符合需求。
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

