合并并绘制多个文本文件
merge and plot multiple text files
我有 60 个文本文件,每个文件有两列,如下所示,每列代表一个独特的样本,标题为 'Coverage' 和 'counts'。每个文件的长度相差几行,因为对于某些 Coverage 值,Count 为零,因此不打印。每个文件大约有 1000 行长。每个文件都以 "B001.BaseCovDist.txt" 到 "B060.BaseCovDist.txt" 的格式命名,在 R 中我将它们命名为 "B001" 到 "B060"。
如何按 Coverage 合并数据框?这因缺少行而变得复杂。我在 bash、base R、reshape(2) 和 dplyr.
中尝试了各种方法
我如何制作一张计数 (y-axis) 与覆盖率 (x-axis) 的单一图表,并将每个独特的样本作为不同的系列。 Ggplot2 似乎很理想,但我似乎需要一个循环或一个列表来添加系列,而不必完整地输入所有名称(这太荒谬了)。
一种看起来不错的方法是添加包含唯一样本名称的第三列,因为这会创建一个熔融数据集。然而,这在 bash (awk) 中不起作用,因为空格分隔符的数量因行而异。
非常欢迎任何帮助。
Coverage Count
1 0 7089359
2 1 983611
3 2 658253
4 3 520767
5 4 448916
6 5 400904
一个好的起点是考虑数据的长格式而不是宽格式。由于您提到了 reshape2
,这应该是有道理的,但也请查看 tidyr
,因为两者的文档都记录了 long/wide.
之间的差异
使用长格式,尝试以下操作:
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()
为了补充你的答案,r2evans 我添加了一个 gsub 命令,以便从添加的列中删除文件名后缀(以及一些无聊的导入修饰符)。
allfiles <- lapply(list.files(pattern='.BasCovDis.txt'), function(sample) cbind(sample=gsub("[.]BasCovDis.txt","", sample), read.table(sample, header=T, skip=3)))
我有 60 个文本文件,每个文件有两列,如下所示,每列代表一个独特的样本,标题为 'Coverage' 和 'counts'。每个文件的长度相差几行,因为对于某些 Coverage 值,Count 为零,因此不打印。每个文件大约有 1000 行长。每个文件都以 "B001.BaseCovDist.txt" 到 "B060.BaseCovDist.txt" 的格式命名,在 R 中我将它们命名为 "B001" 到 "B060"。
如何按 Coverage 合并数据框?这因缺少行而变得复杂。我在 bash、base R、reshape(2) 和 dplyr.
中尝试了各种方法
我如何制作一张计数 (y-axis) 与覆盖率 (x-axis) 的单一图表,并将每个独特的样本作为不同的系列。 Ggplot2 似乎很理想,但我似乎需要一个循环或一个列表来添加系列,而不必完整地输入所有名称(这太荒谬了)。
一种看起来不错的方法是添加包含唯一样本名称的第三列,因为这会创建一个熔融数据集。然而,这在 bash (awk) 中不起作用,因为空格分隔符的数量因行而异。
非常欢迎任何帮助。
Coverage Count
1 0 7089359
2 1 983611
3 2 658253
4 3 520767
5 4 448916
6 5 400904
一个好的起点是考虑数据的长格式而不是宽格式。由于您提到了 reshape2
,这应该是有道理的,但也请查看 tidyr
,因为两者的文档都记录了 long/wide.
使用长格式,尝试以下操作:
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()
为了补充你的答案,r2evans 我添加了一个 gsub 命令,以便从添加的列中删除文件名后缀(以及一些无聊的导入修饰符)。
allfiles <- lapply(list.files(pattern='.BasCovDis.txt'), function(sample) cbind(sample=gsub("[.]BasCovDis.txt","", sample), read.table(sample, header=T, skip=3)))