R 版本 3.5.0 Windows For Loop 读取 csv 未正确读取文件
R version 3.5.0 Windows For Loop read csv not reading file correctly
我有一个包含大量 csv 文件的文件夹 (specdata)。
当我 运行 我的函数读取单个文件时,我没有问题。
但是当我添加一个 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
循环示例,但随着您慢慢地建立 pollutantsum 和 pollutantcount,迫使 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)
请注意,由于您没有提供样本数据,我无法对此进行测试。
我有一个包含大量 csv 文件的文件夹 (specdata)。 当我 运行 我的函数读取单个文件时,我没有问题。 但是当我添加一个 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
循环示例,但随着您慢慢地建立 pollutantsum 和 pollutantcount,迫使 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)
请注意,由于您没有提供样本数据,我无法对此进行测试。