我有一个大的(2300万行) ffdf表(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_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")在数据中,我们可以看到x是data.frame of F1值。在追溯函数中
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'”错误的一个常见原因。
我不知道这个错误的真正原因是什么,也不知道如何修正它。救命啊!-)
发布于 2015-04-03 12:31:16
今天我发现了错误的症结所在。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循环中逐月地分割我的数据,然后把聚集的块加在一起。
https://stackoverflow.com/questions/29416552
复制相似问题