我有一个看起来像这样的文件列表
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作为示例。
有人可以帮我吗?
提前谢谢
答案 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
现在,使用Reduce
和merge
将列表合并在一起(按照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