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
相关产品推荐
相关产品推荐

