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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:39:26