我想合并来自不同文件夹的数据。因此,我首先在当前工作目录中创建一个包含所有地图名的对象(使用list.dirs())。然后我在每个地图中查找特定的文件名(我的模式)。 问题是当文件不包含此特定字符串时,list.files()会出错。
(Error in file(file, "rt") : cannot open the connection In addition: Warning message: In file(file, "rt") : cannot open file 'NA': No such file or directory).
当我只选择我知道包含模式的地图时,代码可以正常工作。
有人知道如何制作list.files()忽略一个不包含特定模式的路径吗?
这是我的代码:
GS.dir<- list.dirs(path = ".", recursive = TRUE)
ligustrum <- c()
for (j in 1:length(GS.dir)){
files <- list.files(GS.dir[j], pattern = glob2rx("li*Avg.txt"), full.names = TRUE)
if(!is.null(files)){
for (i in 1:length(files)){
plot <- read.table(files[i], header = TRUE, sep = ",")
datum <- substr(files[i], 1, 8)
nummer <- substr(files[i], nchar(files[i]) - 7, nchar(files[i]) - 7)
plot.date <- data.frame("Date" = rep(datum, length(plot[,1])),
"plotnr"=rep(nummer,length(plot[,1])),
plot
)
ligustrum <- rbind(ligustrum, plot.date)
}
} else {
ligustrum <- ligustrum
}
}
write.table(ligustrum, "ligustrum.txt", sep = ";", row.names = FALSE)
答案 0 :(得分:0)
GS.dir<- list.dirs(path = ".", recursive = TRUE)
列出了"."
下的所有文件。当您再次致电list.files()
时,您的脚本会执行大量不必要的工作。例如,list.files("./mydir/subdir/subsubdir/file.txt")
将返回character(0)
。我的意见是,你已经在第一行代码中获得了所需的一切。然后你可以通过regexpr:
GS.files <- list.dirs(path = ".", recursive = TRUE)
files <- GS.files[grepl("li*Avg.txt", GS.files)]
之后,使用dplyr
或data.table
代替嵌套循环可能更容易完成工作。
[upd]
require(dplyr)
data.frame(files = list.files(recursive = T)) %>%
filter(grepl("li(.)*Avg.txt",files)) %>%
mutate(files = as.character(files)) %>%
group_by(files) %>%
mutate(datum = substr(substr(files,
max(gregexpr("/",files)[[1]])+1,
nchar(files)
), 1, 8),
nummer = substr(files, nchar(files) - 7, nchar(files) - 7)) %>%
do(data.frame(datum = as.Date(.$datum, format = "%Y%m%d"),
nummer = as.numeric(.$nummer),
read.table(.$files, T))) %>%
arrange(datum, nummer, files) %>%
write.table(.,file = "ligstrum.txt", sep = ";", row.names = F)