【问题标题】:Merge text files by a common column and save as csv file按公共列合并文本文件并保存为 csv 文件
【发布时间】:2021-03-08 07:50:06
【问题描述】:

我有数百个(*.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")

谢谢,

图菲克

【问题讨论】:

    标签: r csv merge tidyverse txt


    【解决方案1】:

    所以这比我最初想象的要简单得多。如果您首先读入所有文件,您可以使用 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 日创建

    【讨论】:

    • 非常感谢您的投入。实际上,所有文本文件都没有列标题(A 列(基因 ID)和 B 列(.counts)列名)。是否可以首先将 A 列输入为“基因 ID”,将 B 列输入为“文件夹中所有文件的样本名称。然后我将运行您的脚本。
    • 所以您的原始文本文件没有您可以使用的标题,您想将它们添加为第二列的文件名?
    • 是的,没错。我想将 A 列添加为“基因 ID”,将 B 列添加为所有文件的“文件名.counts”。否则,我必须在每个文件中手动添加,这将非常繁琐。
    • 我想我解决了您的问题。为了便于使用 tidyverse 函数,我将 Gene ID 更改为gene_ids,因此请注意这一点。我在文件中阅读的方式也会按字母顺序阅读,所以如果重要的话,请注意这一点。
    • 非常感谢。我没有注意到编辑的部分。
    【解决方案2】:

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

    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')
    

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

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 2015-12-22
      • 1970-01-01
      • 2022-11-22
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      相关资源
      最近更新 更多