2

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

我有几十个制表符分隔的 .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。通常我会收到一条错误消息,因为行号不匹配,或者我只是将所有“分数”数据编译到一列中。

关于类似帖子的建议(例如,在 R 中合并多个 csv 文件同时在列表中合并多个 data.frames以及在具有不同行数的列表中合并多个文件)并没有帮助。

我希望这能解决问题。

4

2 回答 2

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))
于 2013-05-02T19:55:56.700 回答
0

我想你想要这样的东西:

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.table'sfread来读取文件,而不是使用 theread.table及其派生类,这样会快得多,而且当我们使用它时,请使用rbindlist而不是do.call(rbind,.

于 2013-05-02T19:39:54.473 回答