【问题标题】:Appending a single variable from multiple files to a data frame or other object type将来自多个文件的单个变量附加到数据框或其他对象类型
【发布时间】:2016-06-29 14:49:23
【问题描述】:

我只是在学习 R。我有 300 个包含降雨数据的不同文件。我想创建一个采用一系列值(即 20-40)的函数。然后,我将读取名为“020.csv”、“021.csv”、“022.csv”等的 csv 文件,直至“040.csv”。

每个文件都有一个名为“rainfall”的变量。我想打开每个 csv 文件,提取“降雨”值并将它们存储(附加)到某种对象,比如数据框(也许其他东西更好?)。因此,完成后,我将拥有一个数据框或列表,其中包含来自所有已处理文件的降雨数据。

这就是我所拥有的……

rainfallValues <- function(id = 1:300) {
    df = data.frame()

      # Read anywhere from 1 to 300 files
    for(i in id) {
          # Form a file name
        fileName <- sprintf("%03d.csv",i)

        # Read the csv file which has four variables (columns). I'm interested in
        # a variable named "rainfall".
        x <- read.csv(fileName,header=T)

        # This is where I am stuck. I know how to exact the "rainfall" variable values from
        # x, I just don't know how to append them to my data frame.
    }
}

【问题讨论】:

  • 您可能会发现this 很有帮助。与其迭代地扩大“data.frame”并重新分配内存,不如在“列表”中获取所有必要的数据,然后使用do.call(rbind, list)

标签: r


【解决方案1】:

这是一个使用lapply 的方法,它将返回降雨列表

rainList <- lapply(id, function(i) {
       temp <- read.csv(sprintf("%03d.csv",i))
       temp$rainfall
})

将其放入单个向量中:

rainVec <- unlist(rainList)

评论
unlist 函数将保留您在文件中读取的顺序,因此rainVec 的第一个元素将是 id 中第一个文件中第一个降雨列的第一个观测值,第二个元素是该文件中的第二个观测值,依此类推到最后一个文件的最后一次观察。

【讨论】:

  • 这是如何工作的?每次调用该方法时,结果都会附加到rainList 向量中吗?我似乎无法完成这项工作。我得到的唯一结果是上次读取文件的结果,而不是所有文件。
  • rainList 行应该生成一个长度与 id 中的文件数相同的列表。列表的每个元素都是一个向量,其中包含 id 中每个文件的雨量列。 RainVec 行将列表强制转换为单个向量。
  • 哦,我现在明白了。这不是我想要的。例如,我不想要 10 个不同的列表,其中包含 10 个列表中的 10 个文件的读数。我想要一个 SINGLE 列表,其中包含单个列表中所有 10 个文件的读数。
  • “列表”是指矢量吗? R 列表是 R 中最通用的数据结构类型,可以容纳很多东西。在包含向量的列表上调用 unlist 将产生一个向量,这听起来像是您正在寻找的。还是您在最后寻找一个 data.frame,其中每个降雨向量都是一列?
  • 谢谢,我知道了。我仍在为 R 使用的“独特”术语而苦苦挣扎。我从事软件开发已有 25 多年了,而 R 使用的术语对我来说似乎大多是倒退的。
猜你喜欢
  • 2018-12-08
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2020-01-08
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多