如何组合文件并将它们与来自单独文件的标识符进行匹配?

问题描述 投票:1回答:2

我在同一个文件夹下有500个txt文件。每个文本文件代表患者并且具有基因列表(在该示例中为miRNA基因)及其相应的表达值。我只对每个相应的miRNA_ID的reads_per_million_miRNA_mapped感兴趣。以下是三个例子:

文件名:0a4af8c8.mirnas.quantification.txt

  miRNA_ID         read_count   reads_per_million_miRNA_mapped  cross.mapped
1 hsa-let-7a-1     39039        5576.681                        N
2 hsa-let-7a-2     38985        5568.967                        Y
3 hsa-let-7a-3     38773        5538.684                        N

文件名:0a867fd6.mirnas.quantification.txt

miRNA_ID           read_count   reads_per_million_miRNA_mapped cross.mapped
1 hsa-let-7a-1     36634        11413.6842                     N
2 hsa-let-7a-2     36608        11405.5837                     N
3 hsa-let-7a-3     36006        11218.0246                     N

文件名:0ac65c4b.mirnas.quantification.txt

miRNA_ID         read_count   reads_per_million_miRNA_mapped cross.mapped
1 hsa-let-7a-1      68376       14254.3693                     N
2 hsa-let-7a-2      67965       14168.6880                     Y
3 hsa-let-7a-3      67881       14151.1765                     N

虽然每个文件都有一个唯一的名称,但该名称并没有告诉我患者的ID,文件中没有任何内容直接告诉我患者的ID。为了确定患者的ID,我使用单独的主CSV文件,其中包括所有患者ID的行以及txt文件的相应文件名。这个csv文件有很多列供我发布示例行,所以我只有下面列出的两列感兴趣。

file_name                            patient_id
0a4af8c8.mirnas.quantification.txt   TCGA-G9-6373-01A
0a867fd6.mirnas.quantification.txt   TCGA-XJ-A9DX-01A
0ac65c4b.mirnas.quantification.txt   TCGA-V1-A9OF-01A

我的目标是创建所有组合txt文件的数据框,其中包含所有基因的所有患者的基因表达数据

miRNA_ID       TCGA-G9-6373-01A   TCGA-XJ-A9DX-01A   TCGA-V1-A9OF-01A
hsa-let-7a-1   5576.681           11413.6842         14254.3693
hsa-let-7a-2   5568.967           11405.5837         14168.6880
hsa-let-7a-3   5538.684           11218.0246         14151.1765

我已经想出了一种方法,通过将文件名和患者ID分组到一个新的数据框中然后使用for循环来组合所有txt文件并添加一个带有文件名的附加列来获取每个文件。然后我使用tidyverse包中的left_join函数来组合数据帧。虽然这是有效的,但它不是资源有效的,因为我正在创建我不需要的额外数据框架和列。我想知道是否有人知道一个更好的方法可以在一个目标中做同样的事情。例如,通过使用for循环中的哪个函数,可以将Expression_value列重命名为患者ID,方法是将通过循环的文件与来自单独主CSV文件中同一行的患者ID相关联。提前致谢。

这是我使用的上一个方法的链接。

How to create a data frame in R where I have to associate different txt files with a sample ID from a separate file?

r
2个回答
0
投票

如果没有您的实际数据,尝试回答这个问题是非常具有挑战性的,所以希望这将是一个有用的设计模式。你需要两件事:

1)您可以根据文件名构造并与主服务器合并的标识模式2)工作目录中的所有文件

这是我建议的:

library(data.table)
library(magrittr)
library(stringr)

setwd("path/to/directory")

# Probably implement some kind of regex on the file name
# to extract the patient name
read_file <- function(file_name){
  fread(file_name) %>% 
    .[,patient_name := str_replace_all(file_name,"regex_string","")]
}

all_files <- list.files(pattern = "file_pattern")

master <- fread("path/to/master")

combined_files <- lapply(all_files, read_file) %>% 
  rbindlist %>% 
  merge(master, by = "patient_name")

本质上,这会将工作目录设置为文件所在的位置,实现一个解析器,该解析器抓取患者姓名以匹配主人,将解析器应用于所有文件,将它们与识别观察结合到一个数据框,然后合并它们与主人。希望它有所帮助!


0
投票

这应该工作。您需要自定义input_folder(或在那里设置您的工作目录并在我的代码中删除对它的引用)。我正在使用患者ID和文件名filekey调用数据框。

library(data.table)

input_folder = "path/to/folder/"
cols_to_keep = c("miRNA_ID", "reads_per_million_miRNA_mapped")
files = lapply(paste0(input_folder, "filekey$file_name"), fread, select = cols_to_keep)

names(files) = filekey$patient_id
long = rbindlist(files, id = T)
result = dcast(long, miRNA_ID ~ .id, value.var = "reads_per_million_miRNA_mapped")
result
#        miRNA_ID TCGA-G9-6373-01A TCGA-V1-A9OF-01A TCGA-XJ-A9DX-01A
# 1: hsa-let-7a-1         5576.681         14254.37         11413.68
# 2: hsa-let-7a-2         5568.967         14168.69         11405.58
# 3: hsa-let-7a-3         5538.684         14151.18         11218.02
© www.soinside.com 2019 - 2024. All rights reserved.