1

我有一个包含 10 列的大型(2300 万行)ffdf 表(tbl_ffdf),其中 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_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 表来说是 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")

在 Data 中,我们可以看到 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'”错误的常见原因。

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

4

1 回答 1

1

今天我发现了错误的原因。的部分源代码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. 因此,通过以下方式修改文件的第 45 行manip-grouped-ffdf.r完全解决了问题:

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

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

于 2015-04-03T12:31:16.097 回答