之前我成功使用了一些代码。它应该将给定目录中的所有文件导入到单个数据集中。我有一个新的数据文件夹,现在我无法让它工作。将读入单个文件.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':没有这样的文件或目录
答案 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()
会返回文件名(带扩展名)的列表,而不是这些文件的完整路径或相对路径。