首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ffbase2 (dplyr_ffbase)中的摘要显示“as.vmode.default() (列表)对象中的错误不能强制输入'double'"?

为什么ffbase2 (dplyr_ffbase)中的摘要显示“as.vmode.default() (列表)对象中的错误不能强制输入'double'"?
EN

Stack Overflow用户
提问于 2015-04-02 15:18:36
回答 1查看 876关注 0票数 1

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

代码语言:javascript
复制
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)聚合数据,以删除这类副本,并使我的表看起来如下:

代码语言:javascript
复制
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 )。我要做的是:

代码语言:javascript
复制
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秒,然后说

代码语言:javascript
复制
Error in as.vmode.default(value, vmode) : 
  (list) object cannot be coerced to type 'double'

在此之后,对我的Rstudio中的设置进行相应的调试,他需要花费3到5分钟的时间才能足够深,停止挂起计算机,并显示错误的功能代码:

代码语言:javascript
复制
function (x, ...) 
UseMethod("as.vmode")

在数据中,我们可以看到x是data.frame of F1值。在追溯函数中

代码语言:javascript
复制
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'”错误的一个常见原因。

我不知道这个错误的真正原因是什么,也不知道如何修正它。救命啊!-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-03 12:31:16

今天我发现了错误的症结所在。summarise_.grouped_ffdf的源代码部分如下所示:

代码语言:javascript
复制
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行完全解决了这个问题:

代码语言:javascript
复制
45     out <- append_to(out, tbl_ffdf(res), check_structure=FALSE) 

这很好,但在那之后,我在使用这个摘要时出现了内存不足的问题。调查结果表明,这是因为grouped_chunks(.data)。我不明白为什么会这样,在这里应该做些什么,我只是在for循环中逐月地分割我的数据,然后把聚集的块加在一起。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29416552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档