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

R语言数据框:按ID前缀匹配含dif的列并提取对应值

解决R语言数据框的匹配列提取需求

嘿,我来帮你搞定这个数据处理任务!根据你的需求,我们需要为每行数据找到列名包含其id前两个字符且带有dif后缀的列,然后把对应的值存入新列。下面提供两种实现方式,你可以根据自己的习惯选择:

方法一:Base R 原生实现

这种方法不需要额外安装包,用原生函数就能搞定:

# 先构造你给出的原始数据框
id <- c("defoo","ghfoo","abfoo") 
abc <- c(.3,.1,.4) 
ghi <- c(.4,.2,.2) 
abc_dif <- c(.4,.3,.8) 
def_dif <- c(.5,.7,.6) 
ghi_dif <- c(.2,.1,.9) 
df <- data.frame(id,abc,ghi,abc_dif,def_dif,ghi_dif)

# 定义一个处理单行的函数
get_matching_dif <- function(row) {
  # 提取当前行id的前两个字符
  prefix <- substr(row["id"], 1, 2)
  # 匹配列名:包含前缀且包含"dif"
  target_col <- grep(paste0(prefix, ".*dif"), names(df), value = TRUE)
  # 返回对应列的数值
  as.numeric(row[target_col])
}

# 对每行应用函数,创建新列`matched_dif`
df$matched_dif <- apply(df, 1, get_matching_dif)

# 查看最终结果
print(df)

运行后你会看到新列matched_dif的值分别是0.5、0.1、0.8,完全符合预期!

方法二:Tidyverse 风格实现

如果你习惯用dplyr这类tidy工具包,下面的代码更简洁直观:

# 先加载需要的包(如果没安装先运行install.packages(c("dplyr", "purrr")))
library(dplyr)
library(purrr)

# 构造原始数据框(和上面一致)
id <- c("defoo","ghfoo","abfoo") 
abc <- c(.3,.1,.4) 
ghi <- c(.4,.2,.2) 
abc_dif <- c(.4,.3,.8) 
def_dif <- c(.5,.7,.6) 
ghi_dif <- c(.2,.1,.9) 
df <- data.frame(id,abc,ghi,abc_dif,def_dif,ghi_dif)

# 用rowwise逐行处理,生成新列
df <- df %>%
  rowwise() %>%
  mutate(
    # 提取id前缀
    prefix = substr(id, 1, 2),
    # 匹配符合条件的列并取值
    matched_dif = as.numeric(pick(matches(paste0(prefix, ".*dif"))))
  ) %>%
  ungroup() %>%
  select(-prefix) # 可选:移除临时生成的prefix列

# 查看结果
print(df)

两种方法都能完美完成任务,你可以根据自己的代码风格偏好选择~

内容的提问来源于stack exchange,提问作者orangeman51

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:05:49