R - 调用导入文件夹时找不到文件,但作为单个文件打开,list.files显示全部?

时间:2016-06-24 06:07:36

标签: r

之前我成功使用了一些代码。它应该将给定目录中的所有文件导入到单个数据集中。我有一个新的数据文件夹,现在我无法让它工作。将读入单个文件.List.files还将显示该文件夹中的所有文件。所以我不知所措。

list.files('../data/')
[1] "B101-2.txt" "B101.txt"   "B116.txt"   "B6.txt"     "B65.txt"    "B67-2.txt"  "B67.txt"   
[8] "B70.txt"    "B71-2.txt"  "B71.txt"    "B95-2.txt"  "B95.txt"    "B96-2.txt"  "B96.txt"   
[15] "B98-2.txt"  "B98.txt"    "B99-2.txt"  "B99.txt"   

a = ldply(
.data = list.files(
    path = '../data/'
        )
, .fun = function(x){
    from_header = scan(x,n = 1,skip=1,quiet=T)
    to_return = read.table(
        file = x
        , skip = 20
        , sep = '\t'
        , fill = TRUE
            )
    to_return$condition = from_header[1]
    return(to_return)
        }
, .progress = 'text'
)
  

文件错误(文件," r"):无法打开连接   另外:警告信息:   在文件(文件," r")中:     无法打开文件' B101-2.txt':没有这样的文件或目录

2 个答案:

答案 0 :(得分:1)

可以直接在list.files中指定完整路径名称。

list.files(path = '../data', full.names = TRUE)

请注意路径规范中遗漏/。如果留下,文件将列为..data//B101-2.txt,这将失败。

TEST 模拟您在Tim Biegeleisen's answer中记下的文件结构:

library(plyr)
dir.create("analysis")
dir.create("data")
write.table(matrix(c(1:57,1:6), ncol=3, byrow=T), file="data/test1.txt", sep="\t", row.names=F, quote=F)
write.table(matrix(c(2:58,7:12), ncol=3, byrow=T), file="data/test2.txt", sep="\t", row.names=F, quote=F)
write.table(matrix(c(3:59,13:18), ncol=3, byrow=T), file="data/test3.txt", sep="\t", row.names=F, quote=F)

我们现在从分析文件夹中运行您的代码。

setwd("analysis")
a = ldply(
.data = list.files(path = '../data', full.names = TRUE)
, .fun = function(x){
    from_header = scan(x,n = 1,skip=1,quiet=T)
    to_return = read.table(file = x, skip = 20, sep = '\t', fill = TRUE)
    to_return$condition = from_header[1]
    return(to_return)
        }
, .progress = 'text'
)

代码读入所有三个文件,并为每个文件输出第21-22行。

a
  V1 V2 V3 condition
1  1  2  3         1
2  4  5  6         1
3  7  8  9         2
4 10 11 12         2
5 13 14 15         3
6 16 17 18         3

答案 1 :(得分:0)

list.files('../data/')正在向您显示文件的B101-2.txt等输出,但是从您list.files()的电话中,您可以看到相对路径为../data/。因此,如果您尝试这样做,例如,read.csv(file="B101-2.txt")它将会失败。相反,呼叫应为read.csv(file="../data/B101-2.txt")。解决问题的方法是使用解决文件所需的完整相对路径。

将此作为ldply()的第一个参数:

.data = paste0("../data/", list.files(path = '../data/'))

要解决的一个关键问题是list.files()会返回文件名(带扩展名)的列表,而不是这些文件的完整路径或相对路径。