首页 文章

合并R中不同行的多个文件

提问于
浏览
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 . 通常我收到一条错误消息,因为行号不匹配或者我只是将所有“得分”数据编译成一列 .

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

我希望这能解决问题 .

2 回答

  • 1

    这个问题可以通过两个步骤解决:

    Step 1. 将csv文件中的数据读入数据框列表,其中 files 是文件名的向量 . 如果需要为 read.csv 添加额外的参数,请添加它们,如下所示 . 有关详细信息,请参见 ?lapply .

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

    Step 2. 计算每个数据框的均值:

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

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

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

    我想你想要这样的smth:

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

    然后,您可以执行任何您喜欢的"by"类型的操作 . 此外,不要忘记调整各种 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, .

相关问题