基于dplyr将缺失n_symp对应的fuX_date转为NA的技术需求
问题描述
现有一个大型DataFrame,包含fu1_至fu20_共20组随访数据,每组由随访日期(fuX_date,Date类型)和对应症状数(fuX_n_symp)组成。要求仅使用dplyr实现:当某组的fuX_n_symp为NA时,将对应的fuX_date转为NA。
原始数据示例:
> df fu1_date fu1_n_symp fu5_date fu5_n_symp fu7_date fu7_n_symp 1 2012-03-05 1 2014-03-05 NA 2016-03-05 1 2 2013-08-09 1 2015-10-09 2 2017-11-09 NA 3 2019-05-05 1 2020-06-07 2 2021-07-09 2
期望处理结果:
> df fu1_date fu1_n_symp fu5_date fu5_n_symp fu7_date fu7_n_symp 1 2012-03-05 1 <NA> NA 2016-03-05 1 2 2013-08-09 1 2015-10-09 2 <NA> NA 3 2019-05-05 1 2020-06-07 2 2021-07-09 2
数据结构定义:
df <- structure(list(fu1_date = structure(c(15404, 15926, 18021), class = "Date"), fu1_n_symp = c(1L, 1L, 1L), fu5_date = structure(c(16134, 16717, 18420), class = "Date"), fu5_n_symp = c(NA, 2L, 2L ), fu7_date = structure(c(16865, 17479, 18817), class = "Date"), fu7_n_symp = c(1L, NA, 2L)), class = "data.frame", row.names = c(NA, -3L))
解决方案(基于dplyr)
利用dplyr的mutate()和across()函数批量处理所有随访组,通过列名匹配实现条件赋值:
library(dplyr) df_processed <- df %>% mutate( # 批量处理fu1_date到fu20_date列 across(paste0("fu", 1:20, "_date"), ~ ifelse(is.na(get(gsub("_date", "_n_symp", cur_column()))), NA, .)) )
代码说明
paste0("fu", 1:20, "_date"):生成全部20个随访日期列的名称,确保覆盖所有目标列。gsub("_date", "_n_symp", cur_column()):将当前处理的日期列名转换为对应的症状数列名(如fu5_date→fu5_n_symp)。get(...):获取对应症状数列的数值,判断是否为NA。ifelse():根据症状数是否为NA,决定保留原日期或设为NA。
内容的提问来源于stack exchange,提问作者cmirian
相关产品推荐
相关产品推荐

