按公共列合并文本文件并另存为 csv 文件

Merge text files by a common column and save as csv file

我有数百个(*.txt 格式)数据文件,其中 A 列为“基因 ID”,B 列为“计数”。我想通过“基因 ID”将所有文件合并为一个 *.csv 文件格式,并通过 *.csv 文件中相应的 *.txt 文件名命名后续计数列(列 B、C D 等)。请协助我。

*.txt 格式的输入文件示例:

Sample_File_1

dput(head(Sample_File_1))
structure(list(`Gene IDs` = c("ENSG00000000003", "ENSG00000000005", 
"ENSG00000000419", "ENSG00000000457", "ENSG00000000460", "ENSG00000000938"
), Sample_File_1.counts = c(0L, 0L, 8L, 10L, 1L, 242L)), row.names = c(NA, 
6L), class = "data.frame")

Sample_File_2

dput(head(Sample_File_2))
structure(list(`Gene IDs` = c("ENSG00000000003", "ENSG00000000005", 
"ENSG00000000419", "ENSG00000000457", "ENSG00000000460", "ENSG00000000938"
), Sample_File_2.counts = c(0L, 0L, 18L, 21L, 3L, 413L)), row.names = c(NA, 
6L), class = "data.frame")

Sample_File_3

dput(head(Sample_File_3))
structure(list(`Gene IDs` = c("ENSG00000000003", "ENSG00000000005", 
"ENSG00000000419", "ENSG00000000457", "ENSG00000000460", "ENSG00000000938"
), Sample_File_3.counts = c(0L, 0L, 24L, 13L, 2L, 400L)), row.names = c(NA, 
6L), class = "data.frame")

Sample_File_4

dput(head(Sample_File_4))
structure(list(`Gene IDs` = c("ENSG00000000003", "ENSG00000000005", 
"ENSG00000000419", "ENSG00000000457", "ENSG00000000460", "ENSG00000000938"
), Sample_File_4.counts = c(0L, 0L, 7L, 7L, 0L, 403L)), row.names = c(NA, 
6L), class = "data.frame")

输出文件示例:

library(tidyverse)
Combined_inner_join <- list(Sample_File_1, Sample_File_2, Sample_File_3, Sample_File_4) %>% reduce(inner_join, by = "Gene IDs")

dput(head(Combined_inner_join))
structure(list(`Gene IDs` = c("ENSG00000000003", "ENSG00000000005", 
"ENSG00000000419", "ENSG00000000457", "ENSG00000000460", "ENSG00000000938"
), Sample_File_1.counts = c(0L, 0L, 8L, 10L, 1L, 242L), Sample_File_2.counts = c(0L, 
0L, 18L, 21L, 3L, 413L), Sample_File_3.counts = c(0L, 0L, 24L, 
13L, 2L, 400L), Sample_File_4.counts = c(0L, 0L, 7L, 7L, 0L, 
403L)), row.names = c(NA, 6L), class = "data.frame")

谢谢,

图菲克

所以这比我最初想象的要简单得多。如果您首先读入所有文件,您可以使用 mget 将它们分配到一个列表,以从全局环境中检索它们。然后你可以使用 reduce 和 inner_join 来获取你想要的文件。我想我有你想要的列名,但如果你想要列名的不同方式,请告诉我。

好的,我下面的编辑应该可以解决问题。这绝对不是最有效的方法,而是我发现的方法。请让我知道这对你有没有用。根据您的文本文件的保存方式,您可能需要在读取所有文件时更改 read_delim 中的 delim 选项。

此方法的好处是您无需从环境中调用文件,因为您只需将它们读入列表即可。

library(tidyverse)

file_list <- list()

all_files <- list.files("~/Documents/Research/test_dir", full.names = TRUE)
for(i in 1:length(all_files)) {
  file_list[[i]] <- read_delim(all_files[i], delim = "\t", col_names = FALSE)
}


file_list_named <- list()
col_names <- vector()

for(i in 1:length(all_files)) {

file_list_named[[i]] <- rename(file_list[[i]], gene_ids = X1)

col_names[i] <- unlist(strsplit(unlist(strsplit(all_files[i], split = '.', fixed = TRUE))[1], split = "/", fixed = TRUE))[7] 

colnames(file_list_named[[i]])[2] <- col_names[i]

}

                                                                                                                                                                            
final_df <- file_list_named %>% reduce(inner_join, by = "gene_ids")

write_csv(final_df, "pat_to_file/file.csv", col_names = TRUE)

reprex package (v0.3.0)

于 2020-11-25 创建

试试这个自定义函数,看看是否有效,

readblk <- function(directory = getwd()) {
  lst <- list.files(directory)
  for (i in 1:length(lst)) {
    tm <- read.csv(lst[i], sep = '\t', header = FALSE)
    colnames(tm) <- c('GeneIDs', paste0('Sample_File_',i,' Counts'))
    if (exists('out') == FALSE) {
      assign('out', tm)
    }
    else{
      out <- merge(out, tm)
    }
  }
  print(out)
}

compiled <-  readblk() 
write.csv(compiled, 'compiled.csv')

如果保存文件的目录是您的工作目录,则无需输入任何内容。否则,添加保存文件的目录路径。 我也重命名了 headers。