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

在R语言中处理缺失数据并按规则生成新变量ZZ

问题:按ID生成ZZ变量

需要为数据框创建变量ZZ,规则如下:

  • 同一ID下,若aa、bb、cc任一变量非缺失且等于1,则ZZ返回1
  • 若aa、bb、cc均非缺失且全部等于0,则ZZ返回0
  • 若三者全为NA,则ZZ返回NA
    每个ID的ZZ值在所有行保持一致,仅能为1、0或NA。

输入数据

示例代码

df <- structure(list(
    ID = c(1,  1,  1,  2,  2,  3,  3,  3),
    aa = c(NA, 0, NA, NA, NA,  1, NA, NA),
    bb = c(NA, 0, NA, NA, NA, NA, NA, NA),
    cc = c(NA, 0, NA, NA, NA,  1,  0,  0)
  ),
  class = "data.frame",
  row.names = c(NA, -8L)
)

数据展示

ID aa bb cc
1  1 NA NA NA
2  1  0  0  0
3  1 NA NA NA
4  2 NA NA NA
5  2 NA NA NA
6  3  1 NA  1
7  3 NA NA  0
8  3 NA NA  0

预期结果

示例代码

structure(list(
    ID = c(1,  1,  1,  2,  2,  3,  3,  3),
    aa = c(NA, 0, NA, NA, NA,  1, NA, NA),
    bb = c(NA, 0, NA, NA, NA, NA, NA, NA), 
    cc = c(NA, 0, NA, NA, NA,  1,  0,  0),
    ZZ = c(0,  0,  0, NA, NA,  1,  1,  1)
  ),
  class = "data.frame",
  row.names = c(NA, -8L)
)

数据展示

ID aa bb cc ZZ
1  1 NA NA NA  0
2  1  0  0  0  0
3  1 NA NA NA  0
4  2 NA NA NA NA
5  2 NA NA NA NA
6  3  1 NA  1  1
7  3 NA NA  0  1
8  3 NA NA  0  1

解决方案

使用dplyr包按ID分组处理,逻辑如下:

  1. 分组后判断该ID下是否存在任一变量非缺失且等于1
  2. 若不存在,再判断该ID下是否有行满足三个变量均非缺失且等于0
  3. 根据判断结果按规则赋值ZZ,最后合并回原数据
library(dplyr)

df_result <- df %>%
  group_by(ID) %>%
  mutate(
    # 标记是否存在任一变量为1(非缺失)
    has_one = any(c_across(aa:cc) == 1, na.rm = TRUE),
    # 标记是否存在行三个变量均为0且非缺失
    all_zero_row = any(!is.na(aa) & !is.na(bb) & !is.na(cc) & aa == 0 & bb == 0 & cc == 0),
    # 按规则生成ZZ
    ZZ = case_when(
      has_one ~ 1L,
      all_zero_row ~ 0L,
      TRUE ~ NA_integer_
    )
  ) %>%
  ungroup() %>%
  select(-has_one, -all_zero_row) # 移除中间辅助变量

# 查看最终结果
print(df_result)

运行代码后即可得到符合预期的结果。

内容的提问来源于stack exchange,提问作者Jenn0804

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:45:20