【问题标题】:R reading multiple files, concatenating resultsR读取多个文件,连接结果
【发布时间】:2014-03-10 21:29:38
【问题描述】:
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] 以保留每个文件的第二行。

谢谢!

【问题讨论】:

  • 您能否准确地更新您的问题?谢谢。
  • 文件的结构是什么?只是文本文件? readLines() 怎么样?我不明白发生了什么。
  • @Elad663 列名在多个文本文件的第 1 列中,而在第 2 列中的值。转置后,值在第 2 行。我想提取每个文件中的值并附加到一个文件中。保留文件的顺序也很重要——需要能够知道哪些值对应于哪个文件。

标签: r


【解决方案1】:

如果您的文件在第一列中都有变量名称,而第二列中的值应该可以工作

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))

【讨论】:

  • @user3403622;如果所有文件都有两列数据,上面的代码应该可以工作。错误是数据没有被读入。尝试只读一个文件: read.table(txtfiles[1],sep="\t") 到确保您的目录正常。您的所有文件都有数据吗?
  • 成功了!!其中一个文件没有任何内容并导致错误。
猜你喜欢
  • 2020-08-07
  • 1970-01-01
  • 2018-11-02
  • 2017-02-04
  • 2017-04-14
  • 2012-10-18
  • 2018-10-04
  • 1970-01-01
  • 2018-12-14
相关资源
最近更新 更多