【问题标题】:merge multiple files with different rows in R在R中合并具有不同行的多个文件
【发布时间】:2013-05-02 18:08:33
【问题描述】:

我知道之前有人问过这个问题,但之前帖子的答案似乎无法解决我的问题。

我有几十个制表符分隔的 .txt 文件。每个文件有两列(“pos”、“score”)。我想将所有“分数”列编译到一个包含多个列的文件中。每个文件的行数不同,与编译无关。

如果有人可以指导我如何实现这一点,最好是在 R 中,那将很有帮助。

或者,我的最终目标是从每个文件中读取“分数”列的中位数和平均值。因此,如果可以实现这一点,无论是否编译文件,都会更有帮助。

谢谢。

更新:

尽管个人密码忍者的想法很吸引人,但我知道这仍然是一个幻想。抱歉没有说清楚。

我尝试过 lapply 和 Reduce,例如,

> files <- dir(pattern="X.*\\.txt$")
> File_list <- lapply(filesToProcess,function(score)
+  read.table(score,header=TRUE,row.names=1))
> File_list <- lapply(files,function(z) z[c("pos","score")])
> out_file <- Reduce(function(x,y) {merge(x,y,by=c("pos"))},File_list)

考虑到我有可变的行号,我知道这并没有什么意义。我也试过 plyr

> files <- list.files()
> out_list <- llply(files,read.table)

还有 cbind 和 rbind。通常我会收到一条错误消息,因为行号不匹配,或者我只是将所有“分数”数据编译到一列中。

关于类似帖子(例如Merging multiple csv files in RSimultaneously merge multiple data.frames in a listMerge multiple files in a list with different number of rows)的建议没有帮助。

我希望这可以解决问题。

【问题讨论】:

  • Stephan - 你能告诉我们你以前尝试过什么,什么没用吗?您的问题可以很容易地在 R 中解决,但如前所述,它非常模糊。 SO 用户不是为你编写代码的个人代码忍者。
  • ?合并。设置 all = FALSE (默认)如何不做你想要的?
  • @Jake 要合并文件,我必须一个一个地列出它们,这是我试图避免的。
  • 您可以使用带有merge() 的循环。
  • 我不明白你为什么使用merge。那是一个数据库JOIN。根据您的描述,您可能会使用cbind.data.frame(但前提是它们的行数相同)或者rbind.data.frame 之前添加了一个原始文件列。如果您将数据保留为“长”形式而不是并排放置列,则 R 中的大多数分析都会进行得更顺利。

标签: r file


【解决方案1】:

这个问题可以分两步解决:

第 1 步。 将 csv 文件中的数据读取到数据框列表中,其中 files 是文件名向量。如果您需要向read.csv 添加额外的参数,请按如下所示添加它们。详情请见?lapply

list_of_dataframes <- lapply(files, read.csv, stringsAsFactors = FALSE)

第 2 步。 计算每个数据帧的均值:

means <- sapply(list_of_dataframes, function(df) mean(df$score))

当然,您总是可以像这样一步完成:

means <- sapply(files, function(filename) mean(read.csv(filename)$score))

【讨论】:

  • 做到了(加上 header=TRUE)。谢谢。
  • 很高兴工作。如果它解决了您的问题,请考虑接受此答案。
【解决方案2】:

我想你想要这样的东西:

all_data = do.call(rbind, lapply(files,
                                 function(f) {
                                   cbind(read.csv(f), file_name=f)
                                 }))

然后,您可以执行您喜欢的任何“按”类型的操作。此外,不要忘记调整各种 read.csv 选项以满足您的需求。

例如完成上述操作后,您可以执行以下操作(以及更多操作):

library(data.table)
dt = data.table(all_data)

dt[, list(mean(score), median(score)), by = file_name]

一个小提示:您也可以使用data.tablefread 来读取文件,而不是使用read.table 及其派生词,这样会更快,而且当我们这样做时,使用rbindlist 而不是do.call(rbind,

【讨论】:

  • 这让我了解了其中的一部分,除了它输出三列:“pos”、“score”和“file_name”,因此所有数据都连续列在一个列中,而不是分开每个文件的列。有什么建议吗?
猜你喜欢
  • 2014-03-28
  • 1970-01-01
  • 2015-03-20
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多