Bio_Infor回歸帖
這是一篇十分簡短的帖子卷扮,但我仍然覺得它很有用茧球,直到你需要它時(shí)晶府,你可能會有和我一樣的感受。
背景介紹
現(xiàn)在我們有1000個(gè)文件碳想,這些文件的列信息類型一樣烧董,簡單來說就是每一列所蘊(yùn)含的信息是一樣的,這樣我們就能對其進(jìn)行按列合并胧奔,當(dāng)然這里只是簡單舉了個(gè)例子逊移,你可以有更復(fù)雜的情形,而不是簡單的批量讀取他們并合并龙填。
解決方案
-
青銅選手
青銅選手的解決方案不做示例也都知道胳泉,挨個(gè)讀取拐叉,然后再rbind()
,當(dāng)然你不覺得煩的話扇商,可以這么干凤瘦,沒人會攔著你。
-
黃金選手
黃金選手有著他們獨(dú)特的解決方法钳吟,比如他們可以結(jié)合使用shell
或perl
和R
廷粒,如果使用shell
他們大概率會這么做:
#in shell
cat *.txt > combine.txt
#in R
data <- read.table(file = 'combine.txt', ...)
當(dāng)然也有人會用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;
然后調(diào)用這個(gè)腳本:
combine.pl *.txt combine.txt
再用R讀取就可以了。
-
鉑金選手
鉑金選手會用R來解決所有問題红且,訣竅不過在于用活了apply
家族函數(shù)和Reduce()
函數(shù):
files <- list.files(path = './', pattern = 'txt$')
data <- lapply(files, FUN = function(file){
read.table(file = file, ...)
})
然后再用Reduce()
函數(shù)合并:
combine <- Reduce(function(dtf1, dtf2)rbind(dtf1, dtf2), data)
除了使用Reduce()
基礎(chǔ)函數(shù)外坝茎,還有purrr
包中的reduce()
函數(shù)是完成同樣的工作的。
combine <- data %>% purrr::reduce(rbind)