我知道之前已经问过这个问题,但以前的帖子的答案似乎无法解决我的问题。
我有几十个制表符分隔的.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 R,Simultaneously merge multiple data.frames in a list和Merge multiple files in a list with different number of rows)没有帮助。
我希望这能解决问题。
答案 0 :(得分: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))
答案 1 :(得分:0)
我想你想要像这样的人:
all_data = do.call(rbind, lapply(files,
function(f) {
cbind(read.csv(f), file_name=f)
}))
然后,您可以执行任何“您喜欢”的操作。此外,不要忘记调整各种read.csv
选项以满足您的需求。
E.g。完成上述操作后,您可以执行以下操作(以及更多):
library(data.table)
dt = data.table(all_data)
dt[, list(mean(score), median(score)), by = file_name]
一个小注释:你也可以使用data.table
的{{1}}来读取文件而不是fread
及其派生词,这样会更快,而且我们就是这样,使用read.table
代替rbindlist
。