将函数应用于 csv 文件列表
Apply a function to a list of csv files
我在名为 myFolder 的文件夹中有 45 个 csv 文件。每个 csv 文件有 13 列和 640 行。
我想读取每个 csv 并将列 7:12 除以 10,然后将其保存在名为 'my folder' 的新文件夹中。这是我的方法
正在使用简单的 for 循环。
library(data.table)
dir.create('newFolder')
allFiles <- list.files(file.path('myFolder'), pattern = '.csv')
for(a in seq_along(allFiles)){
fileRef <- allFiles[a]
temp <- fread(file.path('myFolder', fileRef)
temp[, 7:12] <- temp[, 7:12]/10
fwrite(temp, file.path('myFolder', paste0('new_',fileRef)))
}
是否有更简单的一两行解决方案,使用数据表和应用函数来实现?
如果您想提高代码的可读性并摆脱循环,可以使用purrr::walk
:
allFiles <- list.files(file.path('myFolder'), pattern = '.csv')
purrr::walk(allFiles, function(x){
temp <- fread(file.path('myFolder', x)
temp[, 7:12] <- temp[, 7:12]/10
fwrite(temp, file.path('myFolder', paste0('new_',fileRef)))
})
来自purrr::walk
的参考页:
walk() returns the input .x (invisibly)
不过,我认为它对速度没有帮助。
您的代码已经很不错了,但还可以进行以下改进:
- 预先定义输入和输出文件夹以实现模块化
- 使用
full.names = TRUE
以便 allFiles
包含完整路径
- 使用
.csv$
作为模式将其锚定到文件名的末尾
- 遍历全名而不是索引
- 在
fwrite
中使用basename
从路径名中提取基本名称
代码是
library(data.table)
myFolder <- "myFolder"
newFolder <- "newFolder"
dir.create(newFolder)
allFiles <- list.files(myFolder, pattern = '.csv$', full.names = TRUE)
for(f in allFiles) {
temp <- fread(f)
temp[, 7:12] <- temp[, 7:12] / 10
fwrite(temp, file.path(newFolder, paste0('new_', basename(f))))
}
我在名为 myFolder 的文件夹中有 45 个 csv 文件。每个 csv 文件有 13 列和 640 行。
我想读取每个 csv 并将列 7:12 除以 10,然后将其保存在名为 'my folder' 的新文件夹中。这是我的方法 正在使用简单的 for 循环。
library(data.table)
dir.create('newFolder')
allFiles <- list.files(file.path('myFolder'), pattern = '.csv')
for(a in seq_along(allFiles)){
fileRef <- allFiles[a]
temp <- fread(file.path('myFolder', fileRef)
temp[, 7:12] <- temp[, 7:12]/10
fwrite(temp, file.path('myFolder', paste0('new_',fileRef)))
}
是否有更简单的一两行解决方案,使用数据表和应用函数来实现?
如果您想提高代码的可读性并摆脱循环,可以使用purrr::walk
:
allFiles <- list.files(file.path('myFolder'), pattern = '.csv')
purrr::walk(allFiles, function(x){
temp <- fread(file.path('myFolder', x)
temp[, 7:12] <- temp[, 7:12]/10
fwrite(temp, file.path('myFolder', paste0('new_',fileRef)))
})
来自purrr::walk
的参考页:
walk() returns the input .x (invisibly)
不过,我认为它对速度没有帮助。
您的代码已经很不错了,但还可以进行以下改进:
- 预先定义输入和输出文件夹以实现模块化
- 使用
full.names = TRUE
以便allFiles
包含完整路径 - 使用
.csv$
作为模式将其锚定到文件名的末尾 - 遍历全名而不是索引
- 在
fwrite
中使用basename
从路径名中提取基本名称
代码是
library(data.table)
myFolder <- "myFolder"
newFolder <- "newFolder"
dir.create(newFolder)
allFiles <- list.files(myFolder, pattern = '.csv$', full.names = TRUE)
for(f in allFiles) {
temp <- fread(f)
temp[, 7:12] <- temp[, 7:12] / 10
fwrite(temp, file.path(newFolder, paste0('new_', basename(f))))
}