在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分组处理,逻辑如下:
- 分组后判断该ID下是否存在任一变量非缺失且等于1
- 若不存在,再判断该ID下是否有行满足三个变量均非缺失且等于0
- 根据判断结果按规则赋值
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
相关产品推荐
相关产品推荐

