繁体   English   中英

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

[英]R version 3.5.0 Windows For Loop read csv not reading file correctly

我有一个文件夹(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)

}

我应该指定上面编写的代码,以识别是否在arg中将文件ID 001.csv输入为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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM