【问题标题】:merge.ffdf incorrect result when multiple columns match in R当 R 中的多列匹配时,merge.ffdf 不正确的结果
【发布时间】:2013-06-05 10:08:02
【问题描述】:

我有一个 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)

然后合并两个数据框:

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 包得到的其他结果被毒化了,我没有意识到”

【问题讨论】:

    标签: r join merge


    【解决方案1】:

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

    上面写着:

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

    用粗体标记突出显示的内容。 您对 merge.ffdf 所做的是完全外连接,merge.ffdf 不支持该连接。在文档中标记'first'这个词。还要标记它粘贴是一个键。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多