循环读取多个文本文件时出错

时间:2017-11-03 16:05:22

标签: r loops dataframe connection

我有点坚持使用这段代码...目的是只从文件夹中读取文本文件,文件几乎不同,为每个文件取一列,并为每个提取的列创建一个数据框( cbind.fill是一个手工制作的函数,它添加一个新列并使用NA值填充"空的#34;空格。这是代码:

setwd("...folderOfInterest/")
genes_data <- data.frame()
for(i in list.files(pattern = "^GO_.*txt", full.names = TRUE)){
  print(i) #this works perfectly, it only prints desired files...
  q <- read.table(i, header = TRUE, sep = "\t", quote = NULL)
  genes_data <- cbind.fill(genes_data, q[,2])
}

正如@Adam B建议的那样,这里是print(i)输出和文件夹(folder_screenshot)的屏幕截图:

[1] "./GO_ALPHA_AMINO_ACID_CATABOLIC_PROCESS.xls"
[1] "./GO_ALPHA_AMINO_ACID_METABOLIC_PROCESS.xls"
[1] "./GO_ALPHA_BETA_T_CELL_ACTIVATION.xls"
[1] "./GO_AMINO_ACID_BETAINE_METABOLIC_PROCESS.xls"
[1] "./GO_AMINO_ACID_IMPORT.xls"
[1] "./GO_AMINO_ACID_TRANSMEMBRANE_TRANSPORT.xls"
[1] "./GO_AMINO_ACID_TRANSPORT.xls"
[1] "./GO_AMINOGLYCAN_BIOSYNTHETIC_PROCESS.xls"
[1] "./GO_ANGIOGENESIS.xls"
[1] "./GO_ANION_TRANSPORT.xls"
[1] "./GO_ANTIGEN_PROCESSING_AND_PRESENTATION.xls"
[1] "./GO_ANTIGEN_PROCESSING_AND_PRESENTATION_OF_ENDOGENOUS_ANTIGEN.xls"
Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") :
  cannot open file './GO_ANTIGEN_PROCESSING_AND_PRESENTATION_OF_ENDOGENOUS_ANTIGEN.xls': No such file or directory

(注意:文件&#39;扩展名为.xls,但实际上它们是.txt文件)

它预示着这条消息:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") :
  cannot open file './GO_ANTIGEN_PROCESSING_AND_PRESENTATION.txt': No such file or directory

同样仅运行q <- read.table(i, header = TRUE, sep = "\t", quote = NULL)会出现此错误消息。

我认为我在正确的文件夹中(因为print(i)效果很好),我还更改了full.names选项并将list.files设置为变量循环...但nothins似乎工作。如果有人有任何想法,请随时欢迎!

3 个答案:

答案 0 :(得分:0)

我已经在随机生成的文件上尝试了它并且它有效。您可能不需要使用数据cd进入目录,只需将list.files dir参数与数据目录的路径一起提供即可。

GOfls <- list.files("indata", pattern = "^GO_.*\\.txt", full.names = TRUE)
head(GOfls)
[1] "indata/GO_amswylfbgp.txt" "indata/GO_amswylfbgptxt"  "indata/GO_apqqqktvir.txt"
[4] "indata/GO_arwudmbzsr.txt" "indata/GO_autljyljgn.txt" "indata/GO_beeqcmnayk.txt"
# lapply -> do.call for reading and binding the data is better approach
gene_data <- do.call('cbind', lapply(GOfls, function(path) read.delim(path)[,2]))
# have a look at the data
dim(gene_data)
[1] 100 100

我试图以这种方式重现你的问题(它的可选文本):

dir.create("indata")
fls <- lapply(1:100, function(i) data.frame(matrix(rnorm(1000), ncol = 10)))
names(fls) <- replicate(100, paste0("./indata/", "GO_", 
                                    paste0(sample(letters, 10, replace = T), 
                                           collapse = ""), ".txt"
                                    )
                        )
lapply(names(fls), function(x) write.table(fls[[x]], x, quote = F, sep = "\t"))
head(dir("indata"))
[1] "GO_acebruujkw.pdf" "GO_amswylfbgp.txt" "GO_amswylfbgptxt" "GO_apqqqktvir.txt"
[5] "GO_arwudmbzsr.txt" "GO_autljyljgn.txt"
# I have added some renamed .txt files (.pdf, .tiff, .gel) to the indata
rm(list = ls())

答案 1 :(得分:0)

那已经解决了!这有点奇怪,但将感兴趣的文件夹复制到桌面上,代码似乎再次起作用。

一个配偶和我看到硬盘的活动崩溃了,所以我们认为在阅读过程中可能会出现问题......所以复制文件夹就是(简单)解决方案!

然而,如果有人有解释这种奇怪情况的想法,我相信它会有用!非常感谢!

修改

我已经完成了一些测试,也许问题是文件夹路径的名称,它太长并且会导致循环崩溃。

答案 2 :(得分:-1)

我认为这是因为您正在搜索.xls文件,但之后尝试以.txt文件的形式打开它

在excel中尝试将文件保存为逗号或制表符分隔的文本文件。

如果你想直接打开excel文件,他们有一些可以做到这一点的软件包。试试readxl。