R 版本 3.5.0 Windows For Loop 读取 csv 未正确读取文件



我有一个文件夹(specdata(,里面有一吨csv文件。 当我运行函数来读取单个文件时,我没有问题。 但是当我添加 For 循环以便函数可以采用 Function(1:10( 文件名时,它不会识别有 10 个文件。

pollutantmean <- function(directory = "specdata", pollutant = "sulfate", id = 
"001") {
pollutantcount <- 0
pollutantsum <- 0
filetype <- ".csv"
pathswitch <- "."

file_len <- nchar(id)
if (file_len == 1) {
new_id <- paste("00", id, filetype, sep = "")}
else if (file_len == 2) {
new_id <- paste("0", id, filetype, sep = "")}
else
new_id <- paste(id, filetype, sep = "")
new_path <-  file.path(pathswitch,directory, new_id)
new_data <- read.csv(new_path)
pollutantsum <- pollutantsum + sum(new_data[,pollutant], na.rm=TRUE)
pollutantcount <- pollutantcount + length(na.exclude(new_data[,pollutant])) 
meanofpollutant <- (pollutantsum / pollutantcount) 
print(meanofpollutant)

}

我应该指定上面编写的代码以识别文件 ID 001.csv 是否在 arg 中输入为 1 或 01,它将写入正确的文件名以供读取。

我已经搜索了几个小时,但我无法获得一个示例来了解 For 循环如何清楚地读取 csv 文件名。 如果有人可以建议编辑,我将不胜感激。 谢谢!

这是一个使用for循环的解决方案。

files <- list.files(path = "specdata", pattern = ".csv$")
# Since you build this up you first need a starting value
pollutantsum <- 0
pollutantcount <- 0
# Use the files argument as the 'seq' argument
for (file in files) {
new_data <- read.csv(file)
pollutantsum <- pollutantsum + sum(new_data[,pollutant], na.rm=TRUE)
pollutantcount <- pollutantcount + length(na.exclude(new_data[,pollutant])) 
meanofpollutant <- (pollutantsum / pollutantcount)
}

这是低效for循环的典型示例,但随着您慢慢建立污染物和污染物计数,迫使 R 在循环的每次迭代中移动数据。

更有效的方法是使用lapply()读取文件,然后对列表对象执行操作。粗略地说,您将如何实现:

files <- list.files(path = "specdata", pattern = ".csv$")
files.list <- lapply(files, read.csv)
pollutantsum <- sum(sapply(files.list, function(x) sum(x[, pollutant], na.rm = TRUE)))
pollutantsum <- sum(sapply(files.list, function(x) length(na.exclude(x[,pollutant]))))
meanofpollutant <- (pollutantsum / pollutantcount)

请注意,由于您没有提供示例数据,因此我无法对此进行测试。

最新更新