如何将数据框中的sample_id列映射到对应文件名?
解决方案
你的代码存在两个关键问题:
files是列表类型,grep需要传入字符向量,需先转换为unlist(files);- 在
mutate中直接调用grep时,它会将整个sample_id列作为匹配模式,而非逐行处理单个样本ID。
以下是几种可行的实现方式:
方式一:用dplyr的rowwise()逐行匹配
library(dplyr) # 将列表转为字符向量 files_vec <- unlist(files) df <- df %>% rowwise() %>% mutate(filename = grep(sample_id, files_vec, value = TRUE)) %>% ungroup()
方式二:用purrr的map_chr()批量映射
library(dplyr) library(purrr) files_vec <- unlist(files) df <- df %>% mutate(filename = map_chr(sample_id, ~grep(.x, files_vec, value = TRUE)))
方式三:提取文件名中的样本ID后合并(更稳健)
如果文件名固定为sample_id_xxx.后缀格式,可先从文件名中提取样本ID,生成匹配表后再与原数据框合并,能避免误匹配包含样本ID子串的无关文件名:
library(dplyr) library(stringr) files_vec <- unlist(files) # 生成样本ID与文件名的匹配表 match_df <- tibble( filename = files_vec, sample_id = str_extract(filename, "^x\\d+") # 根据你的样本ID格式调整正则,此处匹配开头的x+数字 ) # 合并到原数据框 df <- df %>% left_join(match_df, by = "sample_id")
内容的提问来源于stack exchange,提问作者APompetti-Cori
相关产品推荐
相关产品推荐

