分配标题时粘贴文件

时间:2018-07-16 16:04:48

标签: r unix

我有一个看起来像这样的文件列表

FILE10

Count_S10        
  GeneA      0.3      
  GeneB      0.4
  GeneC      0.9         
  GeneD      0.1       

.......................

FILE8

Count_S8        
  GeneA      0.22
  GeneB      0.76
  GeneC      0.2         
  GeneD      0.01       

.......................

FILE13

Count_S13        
  GeneA      0.2      
  GeneB      0.04
  GeneC      0.19         
  GeneD      0.111       

.......................

我总共有100个文件,包含5000行。每个文件的第一列都具有标题,而第二列则没有。此外,文件夹中的文件不是按升序排列的。我只是想要以下输出:

FILE1

Gene_List   Count_S8   Count_S10   Count_S13
  GeneA      0.22         0.3         0.2
  GeneB      0.76         0.4         0.04
  GeneC      0.2          0.9         0.19
  GeneD      0.01         0.1         0.111        

此处,仅显示文件8、10、13作为示例。

有人可以帮我吗?

提前谢谢

1 个答案:

答案 0 :(得分:3)

我已经将这些示例文件保存在“ example_files”目录中。首先,将这些文件作为列表获取:

files <- list.files(path = "example_files", full.names = TRUE)

> files
[1] "example_files/File10.txt" "example_files/File13.txt" "example_files/File8.txt" 

以数字方式对其进行排序(如您的预期输出):

files <- files[order(as.numeric(gsub(".*File|.txt", "", files)))]

> files
[1] "example_files/File8.txt"  "example_files/File10.txt" "example_files/File13.txt"

此函数将第一行作为源名称,然后使用read.table来获取实际数据,而跳过第一行。然后,它会正确分配名称以供以后合并:

read_file <- function(filename) {
  source = readLines(filename)[1]
  df_ = read.table(filename, skip = 1, sep = "")
  names(df_) = c("Gene_List", source)
  return(df_)
}

现在,您可以在文件列表中调用该函数:

list_of_files <- lapply(files, read_file)

> list_of_files
[[1]]
  Gene_List Count_S8
1     GeneA      0.3
2     GeneB      0.4
3     GeneC      0.9
4     GeneD      0.1

[[2]]
  Gene_List Count_S10
1     GeneA      0.22
2     GeneB      0.76
3     GeneC      0.20
4     GeneD      0.01

[[3]]
  Gene_List Count_S13
1     GeneA     0.200
2     GeneB     0.040
3     GeneC     0.190
4     GeneD     0.111

现在,使用Reducemerge将列表合并在一起(按照this answer):

> Reduce(function(x, y) merge(x, y, all = TRUE), list_of_files)
  Gene_List Count_S8 Count_S10 Count_S13
1     GeneA      0.3      0.22     0.200
2     GeneB      0.4      0.76     0.040
3     GeneC      0.9      0.20     0.190
4     GeneD      0.1      0.01     0.111