R迭代读取csv文件

时间:2016-04-07 08:39:33

标签: r csv

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

2 个答案:

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