为什么在 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 循环中逐月对数据进行切片,然后将聚合块相互附加。
我有一个很大的(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 循环中逐月对数据进行切片,然后将聚合块相互附加。