【发布时间】:2013-01-31 11:56:56
【问题描述】:
我有一个data.frames 的列表。在我想通过分组 (z) 拆分的每个 data.frame 中运行一个函数,将结果放回一起,然后将嵌套 lapply 的所有结果放在一个 data.frame 中,然后展平结果列表data.frames 合并为一个data.frame。
library(plyr)
df <- data.frame(x = sample(1:200, 30000, replace = TRUE),
y = sample(1:200, 30000, replace = TRUE),
z = sample(LETTERS, 30000, replace = TRUE))
alist <- list(df,df,df) # longer in real life
answer <- lapply(alist, function(q) {
a <- split(q,q$z)
result.1 <- lapply(a, function(w) {
neww <- cbind(w[,1],w[,2])
result.2 <- colSums(neww)
})
ldply(result.1)
})
# cor(neww) can actually be a variey of foos I just use cor() for easy reproducibility
ldply(answer)
这会占用大量内存,而且速度也很慢。感谢@Andrie,我知道如何在开始之前清理我的工作区:
rm(list=setdiff(ls(), "alist"))
但是有没有办法修改我的方法,比如在第二个 lapply 中丢弃 w 等,以尝试减少内存使用并加快速度?在这种情况下,foo 喜欢矩阵,所以data.table 不会是我的答案。在其他foos 中,我将需要所有w,并且课程需要是data.frame
【问题讨论】:
-
请使您的代码可重现。您需要显示
foo。 -
一种策略可能是将所有
data.frames 合并为一个data.table,然后拆分-应用-合并。 -
我使用了很多
foos 作为参数,你可以使用cor。我的重点是围绕foo的代码,但也许我没有抓住重点。 -
重点是让它容易回答。为此,我需要能够将我的结果与您的结果进行比较。这意味着您的代码应该在复制到我的 R 会话时运行。
-
@Roland,刚刚注意到您也提到了
data.table解决方案。