我有100个.out.tab.tpm
格式的文件,对应100个病人。
这是一个。txt文件,可以用fread
函数正常读取,它看起来像这样:
gene_id tpm count V4
ENG2023 234 4 152
ENG2048 0 0 1
ENG2087 2 65 6
gene_id
是指定基因(基因id)的列,所有文件在该列的值相同。tpm
是我感兴趣的测量。
我想要的是加载这些文件,获得gene_id
和tpm
列,并通过gene_id
合并。然后调换,病人将是行名,基因将是列名。
类似如下:
PatientID ENG2023 ENG2048 ENG2087
Patient1 234 0 2
Patient2 123 0 34
Patient3 36 2 1
Patient4 89 0 6
Patient5 456 1 12
你可以为两个文件手动执行:
df1 <- fread("C:/Users/Data/Patient1_ReadsPerGene.out.tab.tpm", select = c("gene_id", "tpm"))
df2 <- fread("C:/Users/Data/Patient2_ReadsPerGene.out.tab.tpm", select = c("gene_id", "tpm"))
df3 <- merge(df1, df2, by="gene_id")
我试着创建一个循环来做这个:
setwd("C:/Users/")
#create a list of the files from your target directory
file_list <- list.files(path="C:/Users/Data/")
#initiate a blank data frame, each iteration of the loop will append the data from the given file to this variable
dataset <- data.frame()
for (i in 1:length(file_list)){
temp_data <- fread(file_list[i], select = c("gene_id", "tpm"))
dataset <- merge(dataset, temp_data, by="gene_id")
}
但是,我得到以下错误:
Error in fix.by(by.x, x) : 'by' must specify a uniquely valid column
强调文本
我建议:
library(data.table)
patients <- c("patient1", "patienta", "patienttoto")
all.files <- paste0(patients, ".out.tab.tpm")
l <- lapply(all.files, fread)
names(l) <- patients
for (n in 1:length(patients)) {
l[[n]][, PatientID := patients[n]]
}
dt <- rbindlist(l)
dcast(dt, PatientID ~ gene_id, value.var="tpm")