Подтвердить что ты не робот

Как мне получить разницу между двумя списками имен R?

Хорошо, у меня есть два названных списка, один из них "ожидается", а один "наблюдается". Они могут быть сложными по структуре с произвольными типами данных. Я хочу получить новый список, содержащий только те элементы наблюдаемого списка, которые отличаются от ожидаемых. Вот пример:

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-подобный, хотя и работоспособный... Есть какие-то элегантные идеи?

4b9b3361

Ответ 1

По крайней мере, в этом случае

Lobs[!(Lobs %in% Lexp)]

дает вам то, что вы хотите.

Ответ 2

ОК, я нашел один слегка тупой ответ, используя пакет plyr:

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

Таким образом, он принимает имена массива из наблюдаемой функции, использует индексирование с двойной привязкой и идентичную() функцию для сравнения подписок, а затем использует двоичный массив, который получается из laply() для индексации в оригинальная наблюдаемая функция.

Кто-нибудь получил лучший/более чистый/более сексуальный/более быстрый способ?