好的,我有两个命名列表,一个是“预期的”,另一个是“观察”。它们的结构可能很复杂,具有任意数据类型。我想获得一个新列表,其中仅包含观察列表中与预期列表中的元素不同的元素。这是一个例子:
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一样,虽然可行......有什么优雅的想法吗?
答案 0 :(得分:27)
至少在这种情况下
Lobs[!(Lobs %in% Lexp)]
给你你想要的东西。
答案 1 :(得分:0)
好的,我使用 plyr 包找到了一个稍微迟钝的答案:
> Lobs[laply(names(Lobs), function(x) !identical(Lobs[[x]], Lexp[[x]]))]
$b
[1] "ni"
因此,它从被观察函数中获取数组的名称,使用双括号索引和相同()函数来比较子列表,然后使用由laply()生成的二进制数组来索引到原始观察函数。
任何人都有更好/更清洁/更性感/更快的方式吗?