2015-04-02 83 views
0

我有一个很大的(23 Mln行)ffdf表(tbl_ffdf),有10列,其中7个是因子,3个包含数字。它看起来是这样的:为什么在ffbase2(dplyr_ffbase)中总结显示“as.vmode.default()(list)对象中的错误不能被强制键入'double'”?

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 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,但想得到一个矩阵?..这是通常的原因“(列表)对象不能被强制键入'双''错误。

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

+0

您是否在读取数据时使用'colClasses'?使用'lapply(TABLE_bad,class)'来找到它。 – Soheil 2015-04-02 16:57:38

+0

@Soheil我在导入数据时没有使用colClasses,但是我后来手动创建了所有必需类型的列。例如,一些F1 ..F7是日期或数字与NAs某处,我使他们的因素与正确排列的级别和级别“NA”lapply(ok_ussd,class) $ virtual [1]“ff_vector”“ff” $ physical [1 “ff_vector”“ff” – inscaven 2015-04-03 06:21:19

+0

对不起,编辑我自己的评论的时间已晚 更多信息可能是 '> lapply(colnames(TABLE_bad),function(x){class(TABLE_bad [,x])}) “因素”[[3]] [1]“因素”[[4]] [1]“因素”[[1]] [1]“数字”[[2]] [1] 5]] [1]“factor”' '[[6]] [1]“factor”[[7]] [1]“integer”[[8]] [1]“numeric”[[9]] [1]“integer”[[10]] [1]“logical”' 其实,F7是最后一列 - 这是合乎逻辑的。 – inscaven 2015-04-03 06:32:07

回答

0

今天我找到了错误的原因。的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循环,并在此之后附加聚合块。

相关问题