如何获得两个R命名列表之间的区别?

时间:2009-09-23 22:25:37

标签: r indexing list set

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

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 = 1 b = 1 相匹配。

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

2 个答案:

答案 0 :(得分:27)

至少在这种情况下

Lobs[!(Lobs %in% Lexp)]

给你你想要的东西。

答案 1 :(得分:0)

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

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

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

任何人都有更好/更清洁/更性感/更快的方式吗?