2015-04-02 49 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循環,並在此之後附加聚合塊。

相關問題