2009-09-23 12 views
10

OK, tengo dos listas con nombre, una es "esperada" y una es "observada". Pueden ser de estructura compleja, con tipos de datos arbitrarios. Quiero obtener una nueva lista que contenga solo los elementos de la lista observada que son diferentes de lo que figura en la lista esperada. Aquí hay un ejemplo:¿cómo obtengo la diferencia entre dos listas con nombre 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 es lo que quiero que sea el resultado. He intentado esto:

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

No, que pierde el nombre, y no creo setdiff presta atención a los nombres. El orden claramente no importa aquí, y no quiero a = 1 para que coincida con b = 1.

No estoy seguro de lo que es un buen enfoque ... Algo que se repite en una lista de nombres (Lobs)? Suena torpe y no parecido a R, aunque viable ... ¿Tiene alguna idea elegante?

Respuesta

22

Por lo menos en este caso

Lobs[!(Lobs %in% Lexp)]

le da lo que quiere.

+0

Ayer estaba usando la función% en% para la depuración y estaba a punto de recomendar eso. –

0

OK, he encontrado una respuesta ligeramente obtuso, utilizando el plyr paquete:

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

Así, se necesita los nombres de la matriz de la función observada, utiliza la indexación de doble soporte y el idéntico () función para comparar las sublistas, luego utiliza la matriz binaria que resulta de laply() para indexar en la función original observada.

¿Alguien consiguió una manera mejor/más limpia/más sexy/más rápida?

+1

No necesita plyr: Lobs [sapply (nombres (Lobs), función (x)! Idénticos (Lobs [[x]], Lexp [[x]]))] – Marek

+0

. @ Harlan - ¿Es posible? para encontrar la diferencia porcentual entre dos listas que tienen la misma estructura? Estoy tratando de comparar cuánto difieren los esperados de los observados? –

Cuestiones relacionadas