2009-09-23 12 views
10

OK, j'ai deux listes nommées, une est "attendue" et une est "observée". Ils peuvent être de structure complexe, avec des types de données arbitraires. Je veux obtenir une nouvelle liste contenant seulement les éléments de la liste observée qui sont différents de ce qui est dans la liste attendue. Voici un exemple:Comment obtenir la différence entre deux listes de noms 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 est ce que je veux que le résultat soit. J'ai essayé ceci:

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

Non, cela perd le nom, et je ne pense pas que setdiff prête attention aux noms. L'ordre n'a pas d'importance ici, et je ne veux pas a = 1 pour correspondre à b = 1.

Vous ne savez pas quelle est une bonne approche ... Quelque chose qui boucle sur une liste de noms (Lobs)? Semble maladroit et non-R-like, bien que réalisable ... Vous avez des idées élégantes?

Répondre

22

Au moins dans ce cas

Lobs[!(Lobs %in% Lexp)]

vous donne ce que vous voulez.

+0

J'utilisais juste la fonction% in% hier pour le débogage et était sur le recommander. –

0

OK, j'ai trouvé une réponse légèrement obtus, en utilisant le plyr package:

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

Ainsi, il prend le nom du tableau de la fonction observée, utilise l'indexation double support et l'identique () pour comparer les sous-listes, puis utilise le tableau binaire résultant de laply() pour indexer la fonction observée originale.

Quelqu'un a-t-il eu une meilleure/plus propre/plus sexy/plus rapide?

+1

Vous n'avez pas besoin de plyr: Lobs [spply (noms (Lobs), fonction (x)! Identique (Lobs [[x]], Lexp [[x]])] – Marek

+0

. @ Harlan - Est-il possible? trouver la différence de pourcentage entre deux listes ayant la même structure? J'essaie de comparer combien les attentes diffèrent de l'observé? –

Questions connexes