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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:51:28