考虑名为"Date" "Location" "V1" "V2"
的数据框列表。每个数据帧都具有相同的列:
library(plyr)
其中V1是一个用实数填充的列
我想计算每个日期/位置组合的说法总数的百分比。这是每个特定日期/位置对的所有数据帧的总和V1,然后计算每个V1观察值与相关样本的份额。
我堆叠了数据帧,因为我不知道如何在没有循环数据帧/日期/位置组合的情况下进行扫描,这显然效率很低。
aggregate <- rbind.fill(listDF)
ptt <- ddply(aggregate,.(Date,Location),transform, share= V1/sum(V1))
prop.table
最后一行导致RStudio崩溃并要求我开始一个新会话。 FWIW,avg数据帧有50k行,列表总共有大约1M行。我应该使用{{1}}吗?
在一个理想的世界中,我会将百分比(ptt)作为每个数据帧中的一列,而不是单个堆叠的数据帧,我将不得不拆分。
*附带问题:有没有办法选择哪个列表元素子集用于任何给定的ptt?我假设在我最初的问题中使用了所有数据帧,但是很乐意根据V2的标准进行选择。
感谢您的帮助。
答案 0 :(得分:1)
如果列表中的每个数据帧具有相同的列,则使用具有指示原始数据帧的额外变量的单个数据帧将更容易。然后,您可以轻松执行按数据框分组的计算。
示例数据
# two data frames
d1 <- data.frame(x = rep(LETTERS[1:2], each = 5), y = rnorm(10))
d2 <- data.frame(x = rep(LETTERS[1:2], each = 7), y = rnorm(14))
# put data frames in a list
L <- list(d1, d2)
我们可以使用dplyr::bind_rows()
将L
“取消列入”单个数据框。 .id
选项指示bind_rows
创建标识原始数据框的显式变量:
library(dplyr)
d <- bind_rows(L, .id = "dat")
现在,您可以按照您创建的变量进行任何汇总:
d %>%
group_by(dat) %>%
summarise(mean_y = mean(y))