R语言如何按行统计非-8值数量 生成子女总数新变量
R中按行统计多列有效取值生成
NumberChild变量实现方案 原有代码仅对Child_1_ID单字段做判断,只能输出是否有第一个子女的0-1标识,要统计4个子女ID字段的有效数量,直接按行对有效判断结果求和即可,以下是经过验证的dplyr实现方式:
方案1:rowSums+across实现(推荐,性能最优写法)
逻辑说明:R中逻辑值TRUE参与数值运算时等价于1,FALSE等价于0,对所有子女字段逐行判断「值不等于-8」后求和,结果就是对应人员的有效子女总数。
library(dplyr) df_new <- df %>% mutate( NumberChild = rowSums( # 选中所有子女ID字段 across(c(Child_1_ID, Child_2_ID, Child_3_ID, Child_4_ID), ~ .x != -8), # 如果字段存在NA缺失值,可打开下面的注释自动忽略缺失值 # na.rm = TRUE ) )
如果你的子女ID字段都是以Child_开头命名,可以把字段选择部分简化为across(starts_with("Child_"), ~ .x != -8),后续新增更高位次的子女字段时无需手动修改列名,代码会自动适配。
方案2:purrr::pmap_int逐行计数(适合复杂判断规则场景)
如果后续需要叠加更多无效值判断规则(比如还要排除值为-9的缺失标识),可以用逐行遍历的写法,逻辑可读性更强:
library(dplyr) library(purrr) df_new <- df %>% mutate( NumberChild = pmap_int( select(., starts_with("Child_")), ~ sum(c(...) != -8) ) )
结果校验
生成变量后可以运行以下代码抽查结果是否符合预期:
# 查看前10行的子女字段和计算出的子女数,核对逻辑 df_new %>% select(starts_with("Child_"), NumberChild) %>% head(10)
校验规则:
- 所有子女ID字段值均为-8时,
NumberChild返回0 - 有n个子女ID字段值不为-8时,
NumberChild返回对应整数n,不会出现仅统计第一个子女的问题。
内容的提问来源于stack exchange,提问作者Valerie Li
相关产品推荐
相关产品推荐

