Ответ 1
По крайней мере, в этом случае
Lobs[!(Lobs %in% Lexp)]
дает вам то, что вы хотите.
Хорошо, у меня есть два названных списка, один из них "ожидается", а один "наблюдается". Они могут быть сложными по структуре с произвольными типами данных. Я хочу получить новый список, содержащий только те элементы наблюдаемого списка, которые отличаются от ожидаемых. Вот пример:
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-подобный, хотя и работоспособный... Есть какие-то элегантные идеи?
По крайней мере, в этом случае
Lobs[!(Lobs %in% Lexp)]
дает вам то, что вы хотите.
ОК, я нашел один слегка тупой ответ, используя пакет plyr:
> Lobs[laply(names(Lobs), function(x) !identical(Lobs[[x]], Lexp[[x]]))]
$b
[1] "ni"
Таким образом, он принимает имена массива из наблюдаемой функции, использует индексирование с двойной привязкой и идентичную() функцию для сравнения подписок, а затем использует двоичный массив, который получается из laply() для индексации в оригинальная наблюдаемая функция.
Кто-нибудь получил лучший/более чистый/более сексуальный/более быстрый способ?