R语言合并二元变量生成新cvd变量及缺失值处理实现方法
R语言心血管疾病合并变量cvd生成方案
原代码使用paste(stroke,MI, BP)仅会将三个变量的取值拼接为字符串,未执行条件判断逻辑,无法生成符合规则的0/1编码cvd变量,以下是分场景的可直接运行实现代码。
无缺失值场景实现
赋值规则:三个变量任意一个取值为0则cvd=0,全为1则cvd=1,两种实现方式按需选择:
- 逻辑判断写法(可读性强)
koratest <- transform( koratest, cvd = ifelse(stroke == 0 | MI == 0 | BP == 0, 0, 1) )
- 逐行取最小值写法(性能更优,适合大样本数据集)
# 只要行内存在0,逐行最小值即为0,否则为1,完全匹配规则 koratest$cvd <- pmin(koratest$stroke, koratest$MI, koratest$BP)
适配缺失值规则的实现
赋值规则:缺失值默认按1判定,任意行存在取值0则cvd=0,无取值0(无论是否含缺失值)则cvd=1,两种实现方式按需选择:
- 逻辑判断写法(可读性强,规则映射清晰)
koratest <- transform( koratest, cvd = ifelse( # 判断时临时将NA替换为1,不修改原变量取值 replace(stroke, is.na(stroke), 1) == 0 | replace(MI, is.na(MI), 1) == 0 | replace(BP, is.na(BP), 1) == 0, 0, 1 ) )
- 逐行取最小值写法(简洁高效,大样本优先选择)
# 取逐行最小值时自动忽略NA,等价于NA按1判定的规则 koratest$cvd <- pmin(koratest$stroke, koratest$MI, koratest$BP, na.rm = TRUE)
规则有效性验证
用给出的含缺失值样例测试上述代码:
# 构建测试数据集 test_df <- data.frame( stroke = c(0,1,0), MI = c(1,NA,NA), BP = c(1,NA,1) ) # 运行简洁版代码生成cvd test_df$cvd <- pmin(test_df$stroke, test_df$MI, test_df$BP, na.rm = TRUE) print(test_df)
输出结果完全匹配预期规则:
stroke MI BP cvd 1 0 1 1 0 2 1 NA NA 1 3 0 NA 1 0
注意事项
- 上述代码均基于base R编写,无需安装额外依赖包,可直接运行
- 代码为向量化运算,百万级样本量也可快速计算,无需编写逐行循环
- 若变量中存在0、1、NA之外的异常取值,需先完成数据清洗再运行代码
内容的提问来源于stack exchange,提问作者Hasan Sohail
相关产品推荐
相关产品推荐

