我有一个带有一吨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文件名。 如果有人可以建议编辑我会很感激。 谢谢!
答案 0 :(得分:0)
这是使用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)
请注意,由于您未提供样本数据,因此我无法对此进行测试。