2016-01-23 27 views
1

我有一個數據表,DT,以列A,B和C.我想每獨特乙只有一個A,以及我想選擇使A基於C的值(子集劃分後數據表選擇最大的C)。缺少的行上的單個列

在此基礎上(難以置信的幫助)SO頁,Use data.table to get first of subgroup based on a variable,我想是這樣的:

test <- data.table(A=c(1:3,1:2),B=c(1:5),C=c(11:15)) 
setkey(test,A,C) 
test[,.SD[.N],by="A"] 

在我的測試情況下,這給了我,似乎是正確的答案:

#  A B C 
# 1: 1 6 16 
# 2: 2 7 17 
# 3: 3 8 18 
# 4: 4 4 14 
# 5: 5 5 15 

並且,正如預期的那樣,行數與DT中「A」的唯一條目數相匹配:

length(unique(test$A)) 
# 5 

然而,當我將它應用於我的實際數據集時,我缺少大約20%的最初約200萬行。

我似乎不能放在一起測試數據集,將創建此類型的損失。實際數據集中沒有空值。還有什麼可能是在數據集中的因素,會導致來自像test[,.SD[.N],by="A"]length(unique(test$A))結果的數量之間的差異?

+0

「類似」或那些確切的命令,只是在不同的數據集? – eddi

+2

另外,目前還不清楚爲什麼你不要簡單地減少數據集,直到找到儘可能小的數據集,而這些數據集仍然表現出任何不需要的行爲。簡單地刪除說最後N行 - 你仍然得到同樣的問題?不,那麼問題出現在最後N行。是的,然後刪除更多的行。超過2M行的二進制搜索最多可以發現21個問題。 – eddi

+0

@eddi:確切的命令,只是改變了適當的列名稱。而且,好點。現在要做... – neuropsych

回答

3

感謝@ EDDI的調試教練,這裏的答案,至少在我的數據集:在科學記數法表示的差分處理。

尤其是:在我的實際數據集,列A和B的是,在導入時從SQL到R,已經在科學記數法輸入很長的數字。原來,test[,.SD[.N],by="A"]length(unique(test$A))命令被不同地處理這樣的:length(unique(test$A))被保留其不同僅在一個小的數字,是不是在印刷爲視覺輸出的摺疊科學記數法格式可見兩個值之間的差異,但test[,.SD[.N],by="A"]是,在本質上,將價值四捨五入,從而將其中的一部分合並在一起。

(我覺得愚蠢的,我沒有這個發佈前趕上自己,但很多感激的幫助! - 我希望以某種方式這個備件別人同樣的困惑,也許)