我在同一个文件夹下有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相关联。提前谢谢。
这是我使用的上一个方法的链接。
答案 0 :(得分: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")
本质上,这会将工作目录设置为文件所在的位置,实现一个解析器,该解析器抓取患者姓名以匹配主人,将该解析器应用于所有文件,将它们与识别观察结合到单个数据框中,以及然后将它们与主人合并。希望它有所帮助!
答案 1 :(得分: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