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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:06:03