pollutantmean <- function(id){
n <- length(id)
for (i in 1 : n){
pol <- read.csv('id[i].csv')
}
}
pollutantmean(150:160)
csv的文件名类似于001.csv,002.csv,100.csv等 001,002和100,这些是id,每个csv都有一列id,如果文件名是001,则内容为1。
当我运行此代码时,控制台提醒我这不是这样的文件ID [i] .csv
答案 0 :(得分:1)
首先,你不需要循环。其次,您需要考虑如何表示ID。
ids <- sprintf("%03i", 1:999) # 0's are padded at the beginning
filenames <- paste0(ids, ".csv")
results <- lapply(filenames, read.csv) # you get a list of data frames
或者,您可以使用,例如:
读取某个文件夹中的所有csv文件results <- lapply(dir(pattern="\\.csv$"), read.csv)
&#34; \。csv $&#34;东西意味着&#34; .csv&#34;必须在文件名的末尾。 (参见?regexpr for technicalities)
...并且一个带数字并返回数据框的函数如下所示:
read.this <- function(i) read.csv(sprintf("%003i.csv",i))
......现在你可以将它提供到你想要的范围:
lapply(101:150, read.this)
答案 1 :(得分:0)
第一个问题是第4行,应该用
代替pol <- read.csv(paste0(id[i], ".csv"))
如果id[i]
在引号内(简单或双引号),则由read.csv
逐条理解,例如该函数正在查找名为id[i].csv
的内容,并解释了您的错误消息。< / p>
但是有了这样的功能,pol
无论如何都会被覆盖。
如果你真的想将这些行包装成一个函数,你需要返回一个列表:
pollutantmean <- function(id){
res <- vector("list", length(id))
for (i in 1:n){
res[[i]] <- read.csv(paste0(id[i], ".csv"))
}
}
但这里的循环不会很优雅,所以我们可以简单地说:
pollutantmean <- function(id){
lapply(id, function(i) read.csv(paste0(i, ".csv"))
}
或者甚至(没有功能选项)这应该有效:
lapply(id, function(i) read.csv(paste0(i, ".csv"))