R读取多个文件,连接结果

时间:2014-03-10 21:29:39

标签: r

NVAR    6957423
RATE    1
MAC 963.605
MAF 0.228126
SING    0
MONO    0
TITV    1.99326
TITV_S  NA
DP  NA
QUAL    NA
PASS    1
FILTER|PASS 1
PASS_S  0

我有几个文件(N = 414),格式如上。在R中,我想读取所有文件,转置,rbind或连接值。我的文件名为age_wg2_ind1.vstats,范围从1到414(在ind [i] .vstats之后)。到目前为止,我已经尝试过了:

txtfiles = list.files(pattern="*.vstats")

for (i in 1:length(txtfiles)){
     tmp = read.table(txtfiles[i],sep="\t")
  ttmp<-t(tmp[i])
 colnames(ttmp)<-ttmp[1,];ttmp2<-ttmp[2:nrow(ttmp),]
}

ttmp错误[2:nrow(ttmp),]:下标超出范围

1)list files命令是否真的以个人#1开头,以#414结尾? 2)不确定将[i]放在哪里以保留每个文件的第二行。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您的文件在第一列中都具有变量名称,并且第二列中的值应该起作用

l <- lapply(txtfiles , function(i) { 
                 r <- read.table(i ,sep="\t")
                 mat <- t(r[,2])
                 colnames(mat) <- r[,1]
                 mat
                 })

(out <- do.call(rbind , l))

如果你在每个文件中有(某些)不同的变量名,请查看plyr包中的rbind.fill

您可以查看txtfiles中文件的顺序 - 不一定会保留文件的数字顺序。您可以在lapply循环之前预处理txtfiles的顺序,或者类似地命名文件,您可以将文件列表定义为

txtfiles2 <- paste0("age_wg2_ind",1:414,".vstats")

修改

猜测您的错误是来自其中一个文件的输入错误 - 您可以试试这个。我已经编制了一些数据显示它正常工作。如果你运行上面的代码(在下面的示例数据上),你会收到一条错误消息'read.table中的错误(i,sep =“\ t”):输入中没有可用的行'。但是通过使用tryCatch,它就可以了。

#Some example data

df <- data.frame(letters[1:3] , 1:3)
write.table(df,"temp1.out",sep="\t" , row.names=F , col.names=F)
write.table(df,"temp2.out",sep="\t", row.names=F , col.names=F)
df[,1] <- df[,2] <- NULL
write.table(df,"temp3.out",sep="\t", row.names=F , col.names=F) # zero columns

#Read in data
txtfiles <- list.files(pattern="*.out")

l <- lapply(txtfiles , function(i) { 
                r <-  tryCatch(read.table(i , sep="\t"), error=function(e) NULL)
                 if(!is.null(r)) {
                     mat <- t(r[,2])
                     colnames(mat) <- r[,1]
                     mat
        }})

l <- l[!sapply(l, is.null)]

(out <- do.call(rbind , l))