ffdfdply 是您解决问题所需的函数,但您使用它错误且效率低下。将 ffdfdply 视为进入每个 FUN,R 允许您放入 RAM 中的最大数据量,但仍然确保通过 RAM 中的每个 id 获取所有数据(或者如果适合 RAM,则可能是多个 id)。
所以 BATCHBYTES 5000 相当小(你真的只有 5 KB 的 RAM - 我猜不是 - 你在 90 年代的 Commodore 上安装了 R 吗?) 接下来,你的 FUNage_fun 写错了。要查看您在 FUN 中获得的内容,您可以将其打印出来。如 FUN=function(x){ print(head(x))); X}。
在FUN中,你在RAM中获取数据,所以你不需要使用min.ff,min就可以了。
另请注意 joran 的评论:如果您的 RAM 允许,您可以在每个块中获得多个 id。确保您的 FUN 执行拆分-应用-组合策略或在 FUN 中使用 dply。
还有另一句话是为了加快速度。你真的需要通过整个 ffdf.您只需要在函数和拆分中使用的列。所以 ffdfdply(x = data[c("id","age_c","treatment")], split = ...) 会做,否则你会在 RAM 中获得不需要的数据。
简而言之,这样的事情就可以解决问题
require(doBy)
result2 <- ffdfdply(
x = data[c("id","age_c","treatment")], split = data$id,
FUN = function(x) summaryBy(age_c ~ id, data=subset(x, treatment %in% c(2,4)), FUN=min))
如果您还想让那些没有接受过治疗 2 和 4 的人也这样做,请这样做。
require(doBy)
result2 <- ffdfdply(
x = data[c("id","age_c","treatment")], split = data$id,
FUN = function(x) {
persons <- unique(x[, "id", drop=FALSE])
result <- merge(
persons,
summaryBy(age_c ~ id, data=subset(x, treatment %in% c(2,4)), FUN=min),
by.x="id", by.y="id", all.x=TRUE, all.y=FALSE
)
result
})