2013-06-05 24 views
0

匹配我有一個數據幀FF windows_ff:merge.ffdf不正確的結果,當多個列中的R

edge  ipaddr  port protocol windowed_qd  class 
1 1182430570 41.2.194.42 1299  1   0   WEB   
2 1182430570 41.2.194.42 1302  1   0   WEB   

我想找到它的行之間的相互關係,所以我決定把該數據幀的精確副本:

outgoing_windows_ff_1 <- ffdf(edge=outgoing_windows_ff$edge, 
             ipaddr=outgoing_windows_ff$ipaddr, 
             influencing_port=outgoing_windows_ff$port, 
             influencing_proto=outgoing_windows_ff$proto, 
             influencing_class=outgoing_windows_ff$class) 

然後合併2個dataframes:

merged <- merge(x=outgoing_windows_ff, y=outgoing_windows_ff_1, 
         by.x=c('edge','ipaddr'),by.y=c('edge','ipaddr')) 

結果是:

edge  ipaddr  port protocol windowed_qd  class influencing_port 
1 1182430570 41.2.194.42 1299  1   0   WEB    1299  
2 1182430570 41.2.194.42 1302  1   0   WEB    1299  

但它是錯誤的,因爲我期望結果中有4行。

做正常dataframes之間的合併:

merged <- merge(x=as.data.frame(outgoing_windows_ff), 
         y=as.data.frame(outgoing_windows_ff_1), 
         by.x=c('edge','ipaddr'),by.y=c('edge','ipaddr')) 

我得到正確的結果:

 edge  ipaddr port protocol windowed_qd class influencing_port influencing_proto 
1 1182430570 41.2.194.42 1299  1   0 WEB    1299     1 
2 1182430570 41.2.194.42 1299  1   0 WEB    1302     1 
3 1182430570 41.2.194.42 1302  1   0 WEB    1299     1 
4 1182430570 41.2.194.42 1302  1   0 WEB    1302     1 

我認爲這是非常危險的,一個特定的操作提供了2分不同的結果,如果FF dataframes或者「正常的數據幀「被使用。這可能會導致中毒結果,實驗者無法知道。我的疑問是:「也許我用ff包得到的其他結果中毒了,但我沒有意識到」

回答

0

您是否閱讀了包ffbase中的merge.ffdf文檔,這是您正在使用的函數?

它說:

該方法是如在基礎包合併相似但只允許內部和左外連接。 馬克,加入基於ffmatch或ffdfmatch,這意味着僅* y中第一 *元件將被添加到x和ffdfmatch工作在鏈路[鹼] {} -ing在一起的鍵來完成。因此,如果您的密鑰包含vmode double列,則這可能不適用。

標記以粗體突出顯示的內容。 你在做什麼merge.ffdf是一個完整的外部聯接,merge.ffdf不支持。在文檔中標記'第一個'。同時標註它粘貼的一把鑰匙。

如果您需要的代碼執行全外連接,隨時推代碼不完全外連接其上的FF對象適用於ffbase GitHub的庫:https://github.com/edwindj/ffbase