合并并绘制多个文本文件

时间:2015-05-26 17:06:02

标签: r ggplot2 dplyr

我有六十个文本文件,每个文件都有两个列,如下所示,每个文件代表一个独特的样本,并且标题为'覆盖范围'和'计数'。每个文件的长度相差几行,因为对于某些Coverage值,Count为零,因此不会打印。每个文件大约1000行。每个文件的格式为" B001.BaseCovDist.txt"到" B060.BaseCovDist.txt",在R中我把它们作为" B001"到" B060"。

  1. 如何按Coverage组合数据框?缺少行会使这变得复杂。我在bash,base R,reshape(2)和dplyr中尝试了各种方法。

  2. 如何将每个独特样本作为一个不同的序列制作一个Counts(y轴)与Coverage(x轴)的单个图形。 Ggplot2看起来很理想,但我似乎需要一个循环或一个列表来添加系列,而不必全部输入所有名称(这将是荒谬的)。

  3. 一种似乎很好的方法是添加包含唯一样本名称的第三列,因为这会创建一个熔融数据集。但是这在bash(awk)中没有用,因为空白分隔符的数量因行而异。

    非常欢迎任何帮助。

      Coverage   Count
    1        0 7089359
    2        1  983611
    3        2  658253
    4        3  520767
    5        4  448916
    6        5  400904
    

2 个答案:

答案 0 :(得分:1)

一个好的起点是考虑宽格式的数据副长格式。由于您提到reshape2,这应该是有意义的,但也请查看tidyr,因为两者的文档都记录了长/宽之间的差异。

使用长格式,请尝试以下操作:

allfiles <- lapply(list.files(pattern='foo.csv'),
                   function(fname) cbind(fname=fname, read.csv(fname)))
dat <- rbind_all(allfiles)
dat
##                  fname Coverage   Count
## 1 B001.BaseCovDist.txt        0 7089359
## 2 B001.BaseCovDist.txt        1  983611
## 3 B001.BaseCovDist.txt        2  658253
## 4 B001.BaseCovDist.txt        3  520767
## 5 B001.BaseCovDist.txt        4  448916
## 6 B001.BaseCovDist.txt        5  400904

ggplot(data=dat, aes(x=Coverage, y=Count, group=fname)) + geom_line()

答案 1 :(得分:0)

只是为了添加你的答案,r2evans我添加了一个gsub命令,以便从添加的列中删除文件名后缀(以及一些无聊的导入修改器)。

allfiles <- lapply(list.files(pattern='.BasCovDis.txt'), function(sample) cbind(sample=gsub("[.]BasCovDis.txt","", sample), read.table(sample, header=T, skip=3)))