[英]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.