为什么在 ffbase2 (dplyr_ffbase) 中汇总显示 "error in as.vmode.default() (list) object cannot be coerced to type 'double'"?

Why summarise in ffbase2 (dplyr_ffbase) shows "error in as.vmode.default() (list) object cannot be coerced to type 'double'"?

我有一个很大的(2300 万行)ffdf table (tbl_ffdf),有 10 列,其中 7 列是因子,3 列包含数字。它看起来像这样:

TABLE_bad

   F1     F2     F3     F4     F5     F6     F7     N1     N2     N3
 1111  01.15  05.14  busns     AA     16      F   55.2  16165      0
 1111  01.15  05.14  busns     AA     16      F   12.5      0   4545
 2222  12.14  11.14  privt     KM      5      T    0.7    255 987777
 2222  12.14  11.14  privt     KM      5      T  111.6   7800      0

我想用 sum(Nx) 聚合数据以删除此类重复项并使我的 table 看起来像这样:

TABLE_ok

   F1     F2     F3     F4     F5     F6     F7     N1     N2     N3
 1111  01.15  05.14  busns     AA     16      F   57.7  16165   4545
 2222  12.14  11.14  privt     KM      5      T  112.3   8055 987777

我正在使用从 github 安装的包 ffbase2(它是 ffdf tables 的 dplyr)。我正在做以下事情:

TABLE_gr <- group_by(TABLE_bad, F1, F2, F3, F4, F5, F6, F7)    # this step finishes OK
                                                               # in approximately 90 sec

TABLE_ok <- summarise(TABLE_gr, sN1 = sum(N1), sN2 = sum(N2), sN3 = sum(N3))

然后它工作了 ~ 10 秒并说

Error in as.vmode.default(value, vmode) : 
  (list) object cannot be coerced to type 'double'

之后它根据我的 Rstudio 中的设置进入调试模式,他花了大约 3-5 分钟才能深入了解,停止挂起计算机并显示出错的功能代码:

function (x, ...) 
UseMethod("as.vmode")

在数据中我们可以看到 x 是 F1 值的 data.frame。在 Traceback 中 - 函数

eval(expr, envir, enclose)
`[<-`(`*tmp*`, ff::hi(N + 1, N + n), , value = -*etc*-
append_to(out, res, -*etc*-
summarise_.grouped_ffdf( -*etc*-

查看 ffbase2 的源代码并没有给我太多...我有一些类似方法 summarise_.grouped_ffdf 使用数据的递归切片,并且可能在最后一步它得到一些 data.frame但想得到一个矩阵?..这是“(列表)对象不能被强制键入 'double'”错误的常见原因。

我不知道这个错误的真正原因是什么以及如何解决它。请帮助! :-)

今天我找到了错误的原因。 summarise_.grouped_ffdf 的部分源代码如下所示:

42   for (i in grouped_chunks(.data)){
43     ch <- grouped_df(data_s[i,,drop=FALSE], groups(.data))
44     res <- summarise_(ch, .dots = dots)
45     out <- append_to(out, res, check_structure=FALSE)
46   }

此函数根据组(第 43 行)将数据分成几部分,并对它们应用通常的 dplyr 汇总(第 44 行)。然后它将结果附加到输出变量。但是查看 append_to 的源代码告诉我们,正确的附加变量 res 必须是一个 tbl_ffdf 对象,但这里我们有简单的 data.frame。所以,按照下面的方式修改文件manip-grouped-ffdf.r的第45行就完全解决了问题:

45     out <- append_to(out, tbl_ffdf(res), check_structure=FALSE) 

这很好,但是之后我在使用这个摘要时遇到了 运行 内存不足的问题。调查得出的事实是因为grouped_chunks(.data)。我没有深究为什么会这样以及在这里做什么,我只是在 for 循环中逐月对数据进行切片,然后将聚合块相互附加。