【问题标题】:R iterate to read csv filesR 迭代读取 csv 文件
【发布时间】:2016-04-07 08:39:32
【问题描述】:
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

【问题讨论】:

    标签: r csv


    【解决方案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)
    

    “\.csv$”意味着“.csv”必须在文件名的末尾。 (有关技术细节,请参见 ?regexpr)

    ... 一个接受数字并返回数据框的函数如下所示:

    read.this <- function(i) read.csv(sprintf("%003i.csv",i))
    

    ...现在您可以将它应用到您想要的范围:

    lapply(101:150, read.this)
    

    【讨论】:

      【解决方案2】:

      第一个问题是第4行,应该换成

      pol <- read.csv(paste0(id[i], ".csv"))
      

      如果id[i] 在引号内(单引号或双引号),则read.csv 完全可以理解,例如,该函数正在查找名为id[i].csv 的内容并解释了您的错误消息。

      但是有了这样的功能,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"))
      

      【讨论】:

        猜你喜欢
        • 2022-01-20
        • 2015-11-26
        • 2014-09-15
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        • 2015-01-14
        • 2021-05-24
        • 2011-04-19
        相关资源
        最近更新 更多