如何用tidyverse根据癌症表型缺失将对应年龄变量设为NA
基于tidyverse的解决方案
要实现“当癌症表型变量缺失时,将对应年龄变量设为NA”的需求,关键是为每个*_age变量匹配对应的cancer_*变量,利用across()结合字符串处理和变量引用即可完成:
library(tidyverse) set.seed(42) cancer_ds <- data.frame(id = 1000:1009, cancer_a = rep(0:1, length = 10), cancer_b = c(rep(0, 3), NA, NA, 1, NA, rep(1, 3)), cancer_c = c(rep(0:1, each = 2, len = 6), rep(NA, 4)), a_age = sample(30:60, 10, FALSE), b_age = sample(30:60, 10, FALSE), c_age = sample(30:60, 10, FALSE) ) # 核心实现代码 out_ds <- cancer_ds %>% mutate( across( ends_with("age"), ~ifelse( is.na(!!sym(str_c("cancer_", str_remove(cur_column(), "_age")))), NA, .x ) ) ) # 验证结果与期望输出一致 all.equal(out_ds, out_ds_exp)
代码说明
ends_with("age"):选中所有以age结尾的年龄变量cur_column():获取当前正在处理的年龄列名(如a_age)str_remove(cur_column(), "_age"):提取年龄变量的前缀(如从a_age得到a)str_c("cancer_", ...):拼接成对应的癌症表型变量名(如cancer_a)!!sym(...):将字符串形式的变量名转换为可引用的列变量ifelse(is.na(...), NA, .x):当对应癌症表型为NA时,将年龄设为NA,否则保留原值
该方案无需手动指定每一组变量,可自动适配20余种癌症类型的数据集。
内容的提问来源于stack exchange,提问作者ceruleanclouds
相关产品推荐
相关产品推荐

