R版本3.5.0 Windows For循环读取csv无法正确读取文件

时间:2018-06-19 10:21:34

标签: r for-loop multiple-files read.csv

我有一个带有一吨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文件名。 如果有人可以建议编辑我会很感激。 谢谢!

1 个答案:

答案 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)

请注意,由于您未提供样本数据,因此我无法对此进行测试。