【问题标题】:Writing a loop to apply the operator 'data.frame' multiple times编写循环以多次应用运算符'data.frame'
【发布时间】:2012-07-11 07:15:15
【问题描述】:

我想编写一个循环来从一组已经存在的矩阵创建多个数据帧。 我已经使用代码导入并创建了这些:

temp<-list.files(pattern="*.csv")
ddives <- lapply(temp, read.csv)

所以“ddives”是我的一组 csv 文件。我现在想使用循环版本的代码从其中的每一个中创建一个数据框:

d.dives1<- data.frame(ddives[1])

【问题讨论】:

  • ... read.csv 不是已经返回 data.frame 了吗?
  • 不,不幸的是,使用此代码它刚刚返回了 165 个(我拥有的文件数)列表,我需要将这些列表转换为数据帧
  • 我非常怀疑它会返回 165 个列表。它更有可能返回 1 个包含 165 个数据帧作为元素的列表。 ddives[[1]] 会给你第一个 data.frame,ddives[[2]] 会给你第二个...
  • 如果您只想将它​​们放在单独的变量中,那么将其保留为列表可能会更聪明、更有效......
  • 数据是否相关?你会在所有data.frames 上做类似的操作吗?如果你是,最好(更有效,正如@Dason 指出的那样)将它们保留为一个列表并熟悉apply 系列函数。

标签: r csv for-loop dataframe lapply


【解决方案1】:

在我回答您的问题之前,先快速了解一下术语:

  1. read.csv() 的结果是data.frame
  2. lapply() 的结果是list

因此您现在有了一个数据框列表。

如果您可以安全地假设列表中的数据框具有相同的结构(即相同的列数和相同的类),那么您可以使用rbind() 组合您的列表将数据帧合并为一个 data.frame

为方便起见,您可以使用do.call(),如下所示:

do.call(rbind, ddives)

do.call 使用列表元素作为参数从函数构造调用。如果它们被命名,它们将作为命名参数传递,否则按顺序传递(与 R 中一样)。在这种情况下,您将rbind 应用于列表中的所有元素,从而创建一个data.frame


这显然未经测试,因为我没有您的数据。但是,一般来说,do.call 对于这种类型的操作来说是一个有用的函数。

【讨论】:

  • 我会小心地说do.call'将函数应用于列表'。它使用列表的元素作为给定函数的参数。我认为lapply 可以更充分地描述为“将函数应用于列表”。
  • 很好的答案(并且赞成)。这很挑剔,但由于我们在讨论细节...do.call 使用列表元素作为参数从函数构造调用。如果它们被命名,它们将作为命名参数传递,否则按顺序传递,就像在R 中一样。所以对于mean 函数的默认方法:function (x, trim = 0, na.rm = FALSE, ...) 这些会产生不同的结果:do.call("mean", list(x = c(1:10, NA), na.rm = TRUE))do.call("mean", list(x = c(1:10, NA), TRUE))do.call("mean", list(c(1:10, NA), na.rm = TRUE))
  • @Joshua 谢谢。再次编辑答案(通过复制和粘贴您的文本)。如有必要,请随时编辑和改进。
【解决方案2】:

由于这是您之前发布的问题的后续,请尝试以下操作:

for (i in 1:length(ddives)) assign(temp[i], ddives[[i]])

【讨论】:

  • 然后你可以再次使用 ddives[[i]] - 不需要所有其他废话,因为列表中的每个元素都应该已经是一个数据框了。
  • @Dason,我完全同意你的看法。这就是为什么我以我的方式回答the original question。现在我只是为 this 问题提供一个答案。 不想让我的工作区充满 165 个文件,因为我只能使用列表索引功能。
  • 我实际上是在assign语句中说的。当你可以使用 ddives[[i]] 时,为什么还要使用 data.frame(unlist(stuff))?它应该做同样的事情,不是吗?
  • @Dason,(拍打额头)。这是印度的就寝时间。我已经编辑了我的答案。谢谢!
【解决方案3】:

如果你真的想要你的代码的循环版本,这将是:

for (i in 1:length(ddives)){
  assign(paste("d.dives", i, sep =""), ddives[i])
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多