【问题标题】:merge and plot multiple text files合并和绘制多个文本文件
【发布时间】:2015-05-26 17:06:02
【问题描述】:

我有 60 个文本文件,每个文件有两列,如下所示,每列代表一个独特的样本,标题为“覆盖率”和“计数”。每个文件的长度相差几行,因为对于 Coverage 的某些值,Count 为零,因此不打印。每个文件大约有 1000 行长。每个文件的命名格式为“B001.BaseCovDist.txt”到“B060.BaseCovDist.txt”,在 R 中我将它们命名为“B001”到“B060”。

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

  2. 如何制作一个计数(y 轴)与覆盖率(x 轴)的单一图表,每个唯一样本作为不同的系列。 Ggplot2 看起来很理想,但我似乎需要一个循环或一个列表来添加系列,而不必完整输入所有名称(这很荒谬)。

一种看起来不错的方法是添加包含唯一样本名称的第三列,因为这会创建一个熔融数据集。但是,这在 bash (awk) 中不起作用,因为空格分隔符的数量因行而异。

非常欢迎任何帮助。

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

【问题讨论】:

  • 我建议在您的计划中分离文件处理和绘图逻辑。想想你的绘图应该是什么样子,以及你需要什么样的特定数据。如果您知道您的绘图究竟需要什么,请开始编写逻辑以从您的文本文件中提取此信息,最后创建一个包含绘图数据的数据框(例如,作为 csv 文件)。

标签: r ggplot2 dplyr


【解决方案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()

【讨论】:

  • 辛苦了。非常感谢
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-02
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多