0

我有一个 ff 数据框 windows_ff:

    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个数据框:

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 行。

在普通数据框之间进行合并:

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

我认为如果使用 ff 数据帧或“普通数据帧”,某个操作会给出 2 个不同的结果,这真的很危险。这可能导致中毒的结果,实验者无法知道这一点。我的疑问是:“也许我用 ff 包获得的其他结果被毒化了,我没有意识到”

4

1 回答 1

0

您是否阅读了 ffbase 包中的 merge.ffdf 文档,这是您正在使用的功能?

它说:

此方法类似于基础包中的合并,但只允许内连接和左外连接。标记连接是基于 ffmatch 或 ffdfmatch 完成的,这意味着只有 y 中的 * first *元素将被添加到 x 并且 ffdfmatch 在 link[base]{ paste } 上工作 - 将一个键组合在一起。因此,如果您的密钥包含 vmode double 列,这可能不适合。

标记以粗体突出显示的内容。您对 merge.ffdf 所做的是一个完整的外部连接,它不受 merge.ffdf 支持。在文档中标记“第一”一词。还要标记它粘贴一个键。

如果您需要执行完全外部联接的代码,请随时推送执行完全外部联接的代码,该代码适用于 ffbase 的 github 存储库上的 ff 对象:https ://github.com/edwindj/ffbase

于 2013-06-05T13:49:26.887 回答