在R中使用动态名称变量循环遍历文件
Looping through files using dynamic name variable in R
我有大量文件要导入,这些文件都保存为 zip 文件。
从阅读其他帖子来看,我似乎需要传递 zip 文件名,然后传递我要打开的文件的名称。因为我有很多,所以我想我可以遍历所有文件并一个一个导入它们。
有没有办法动态传递名称,或者有更简单的方法吗?
这是我目前的情况:
Temp_Data <- NULL
Master_Data <- NULL
file.names <- c("f1.zip", "f2.zip", "f3.zip", "f4.zip", "f5.zip")
for (i in 1:length(file.names)) {
zipFile <- file.names[i]
dataFile <- sub(".zip", ".csv", zipFile)
Temp_Data <- read.table(unz(zipFile,
dataFile), sep = ",")
Master_Data <- rbind(Master_Data, Temp_Data)
}
我收到以下错误:
In open.connection(file, "rt") :
我可以使用以下方法手动导入它们:
dt <- read.table(unz("D:/f1.zip", "f1.csv"), sep = ",")
我可以动态地创建 sting,但它感觉很冗长 - 当我用 read.table(unz(...)) 包装它时它不起作用。似乎找不到文件名,因此抛出错误
cat(paste(toString(shQuote(paste("D:/",zipFile, sep = ""))),",",
toString(shQuote(dataFile)), sep = ""), "\n")
但如果我将其打印到控制台,我会得到:
"D:/f1.zip","f1.csv"
然后我可以将其粘贴到 `read.table(unz(....)) 中并且它有效所以我觉得我很接近
我在 data.table 中做了标记,因为这是我几乎总是使用的,所以如果可以用 'fread' 来完成,那就太好了。
感谢任何帮助
您可以在此处使用 list.files
命令:
首先设置您的工作目录,您的所有文件都存储在那里:
setwd("C:/Users/...")
然后
file.names = list.files(pattern = "*.zip", recursive = F)
那么你的 for 循环将是:
for (i in 1:length(file.names)) {
#open the files
zipFile <- file.names[i]
dataFile <- sub(".zip", ".csv", zipFile)
Temp_Data <- read.table(unz(zipFile,
dataFile), sep = ",")
# your function for the opened file
Master_Data <- rbind(Master_Data, Temp_Data)
#write the file finaly
write_delim(x = Master_Data, path = paste(file.names[[i]]), delim = "\t",
col_names = T )}
我有大量文件要导入,这些文件都保存为 zip 文件。
从阅读其他帖子来看,我似乎需要传递 zip 文件名,然后传递我要打开的文件的名称。因为我有很多,所以我想我可以遍历所有文件并一个一个导入它们。
有没有办法动态传递名称,或者有更简单的方法吗?
这是我目前的情况:
Temp_Data <- NULL
Master_Data <- NULL
file.names <- c("f1.zip", "f2.zip", "f3.zip", "f4.zip", "f5.zip")
for (i in 1:length(file.names)) {
zipFile <- file.names[i]
dataFile <- sub(".zip", ".csv", zipFile)
Temp_Data <- read.table(unz(zipFile,
dataFile), sep = ",")
Master_Data <- rbind(Master_Data, Temp_Data)
}
我收到以下错误:
In open.connection(file, "rt") :
我可以使用以下方法手动导入它们:
dt <- read.table(unz("D:/f1.zip", "f1.csv"), sep = ",")
我可以动态地创建 sting,但它感觉很冗长 - 当我用 read.table(unz(...)) 包装它时它不起作用。似乎找不到文件名,因此抛出错误
cat(paste(toString(shQuote(paste("D:/",zipFile, sep = ""))),",",
toString(shQuote(dataFile)), sep = ""), "\n")
但如果我将其打印到控制台,我会得到:
"D:/f1.zip","f1.csv"
然后我可以将其粘贴到 `read.table(unz(....)) 中并且它有效所以我觉得我很接近
我在 data.table 中做了标记,因为这是我几乎总是使用的,所以如果可以用 'fread' 来完成,那就太好了。
感谢任何帮助
您可以在此处使用 list.files
命令:
首先设置您的工作目录,您的所有文件都存储在那里:
setwd("C:/Users/...")
然后
file.names = list.files(pattern = "*.zip", recursive = F)
那么你的 for 循环将是:
for (i in 1:length(file.names)) {
#open the files
zipFile <- file.names[i]
dataFile <- sub(".zip", ".csv", zipFile)
Temp_Data <- read.table(unz(zipFile,
dataFile), sep = ",")
# your function for the opened file
Master_Data <- rbind(Master_Data, Temp_Data)
#write the file finaly
write_delim(x = Master_Data, path = paste(file.names[[i]]), delim = "\t",
col_names = T )}