【问题标题】:how do I get the difference between two R named lists?如何区分两个 R 命名列表?
【发布时间】:2010-11-30 22:19:33
【问题描述】:

好的,我有两个命名列表,一个是“预期的”,一个是“观察到的”。它们的结构可能很复杂,具有任意数据类型。我想获得一个新列表,其中仅包含观察列表中与预期列表中的元素不同的元素。这是一个例子:

Lexp <- list(a=1, b="two", c=list(3, "four"))
Lobs <- list(a=1, c=list(3, "four"), b="ni")
Lwant <- list(b="ni")

Lwant 是我想要的结果。我试过这个:

> setdiff(Lobs, Lexp)
[[1]]
[1] "ni"

不,这会丢失名称,而且我认为 setdiff 不会注意名称。顺序在这里显然无关紧要,我不希望 a=1b=1 匹配。

不确定什么是好的方法...循环遍历 names(Lobs) 列表的东西?听起来很笨拙且不像 R,虽然可行...有什么优雅的想法吗?

【问题讨论】:

    标签: r indexing list set


    【解决方案1】:

    好的,我找到了一个稍微迟钝的答案,使用 plyr 包:

    > Lobs[laply(names(Lobs), function(x) !identical(Lobs[[x]], Lexp[[x]]))]
    $b
    [1] "ni"
    

    因此,它从观察函数中获取数组的名称,使用双括号索引和相同() 函数来比较子列表,然后使用从 laply() 得到的二进制数组来索引原始观测函数。

    有人有更好/更干净/更性感/更快的方法吗?

    【讨论】:

    • 你不需要 plyr: Lobs[sapply(names(Lobs), function(x) !identical(Lobs[[x]], Lexp[[x]]))]
    • .@Harlan - 是否可以找到具有相同结构的两个列表之间的百分比差异?我正在尝试比较预期与观察到的差异有多大?
    【解决方案2】:

    至少在这种情况下

    Lobs[!(Lobs %in% Lexp)]

    给你你想要的。

    【讨论】:

    • 我昨天只是在使用 %in% 函数进行调试,并且是关于推荐的。
    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2020-01-08
    • 1970-01-01
    • 2021-07-13
    • 2021-07-30
    相关资源
    最近更新 更多