R语言如何批量提取列组首个有效值(优先取基线值否则取首次值)
实现方案
这里提供两种常用实现方式,都无需硬编码指标名,可自动适配所有符合命名规则的检测指标:
1. tidyverse(dplyr)实现(推荐)
用across批量遍历列,配合coalesce直接实现优先取非空基线值的逻辑,代码简洁易维护:
library(tidyverse) # 你的原始数据 data <- structure(list(WBC_BASELINE = c(2.9, NA, NA, 6.9, NA, NA, NA, NA, NA, NA, 7.4, 12.8, NA, NA, NA, NA, NA, 4.2, NA, NA), WBC_FIRST = c(2.4, 14.8, 11, 7.3, 4.5, NA, NA, 6.1, 7.7, 16.2, 5.3, 10.3, 14.5, NA, NA, 12.8, 3.7, 4.7, 16.6, 9.3), neuts_BASELINE = c(2, NA, NA, 5.4, NA, NA, NA, NA, NA, NA, 4.96, 8.9, NA, NA, NA, NA, NA, NA, NA, NA), neuts_FIRST = c(1.5, 13, 5.8, 4.5, 1.6, NA, NA, 1.7, 4.3, 9.3, 3.4, 5.8, 10.1, NA, NA, 9.7, 2.3, 3.5, 5, 8.2)), row.names = c(NA, 20L), class = "data.frame") # 批量处理代码 data_new <- data %>% mutate( across(ends_with("_BASELINE"), ~coalesce(., get(str_replace(cur_column(), "_BASELINE$", "_FIRST"))), .names = "{str_remove(.col, '_BASELINE$')}_first_value") )
逻辑说明
ends_with("_BASELINE")自动筛选所有基线列,不管有多少个检测指标都可以自动识别cur_column()获取当前遍历的基线列名,替换后缀即可匹配到对应的首次检测列coalesce()会返回传入参数里第一个非缺失值,刚好匹配「基线非空取基线,否则取首次」的规则,比ifelse写法更高效.names参数自动按照你需要的格式生成新列名,格式为指标名_first_value
2. 基础R实现
如果不依赖第三方包,可以用循环批量处理:
# 提取所有检测指标的前缀 prefixes <- unique(sub("_.*$", "", names(data))) # 循环生成新列 for (p in prefixes) { bl_col <- paste0(p, "_BASELINE") first_col <- paste0(p, "_FIRST") data[[paste0(p, "_first_value")]] <- ifelse(!is.na(data[[bl_col]]), data[[bl_col]], data[[first_col]]) }
内容的提问来源于stack exchange,提问作者lecb
相关产品推荐
相关产品推荐

