Bio_Infor回归帖
这是一篇十分简短的帖子,但我仍然觉得它很有用,直到你需要它时,你可能会有和我一样的感受。
背景介绍
现在我们有1000个文件,这些文件的列信息类型一样,简单来说就是每一列所蕴含的信息是一样的,这样我们就能对其进行按列合并,当然这里只是简单举了个例子,你可以有更复杂的情形,而不是简单的批量读取他们并合并。
解决方案
-
青铜选手
青铜选手的解决方案不做示例也都知道,挨个读取,然后再rbind()
,当然你不觉得烦的话,可以这么干,没人会拦着你。
-
黄金选手
黄金选手有着他们独特的解决方法,比如他们可以结合使用shell
或perl
和R
,如果使用shell
他们大概率会这么做:
#in shell
cat *.txt > combine.txt
#in R
data <- read.table(file = 'combine.txt', ...)
当然也有人会用perl
来解决:
#perl script
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use autodie;
use utf8;
#this script can be used to combine several files;
#the format of use:
# combine.pl [files] [dest.files]
if (! defined $ARGV[0] || $ARGV[0] eq "--help" || $ARGV[0] eq "-h"){
die "The usage of this script:\n\t$0 [input files] [dest files]\n";
}
my $out = pop @ARGV;
open my $out_fh, '>>', $out;
while (<>){
print { $out_fh } $_;
}
close $out_fh;
然后调用这个脚本:
combine.pl *.txt combine.txt
再用R读取就可以了。
-
铂金选手
铂金选手会用R来解决所有问题,诀窍不过在于用活了apply
家族函数和Reduce()
函数:
files <- list.files(path = './', pattern = 'txt$')
data <- lapply(files, FUN = function(file){
read.table(file = file, ...)
})
然后再用Reduce()
函数合并:
combine <- Reduce(function(dtf1, dtf2)rbind(dtf1, dtf2), data)
除了使用Reduce()
基础函数外,还有purrr
包中的reduce()
函数是完成同样的工作的。
combine <- data %>% purrr::reduce(rbind)
网友评论