Hola, Tengo una lista, llamada lis, cuyos elementos son los siguientes:>lis[[1]] [1] "Pepe" [2] "Miguel" [3] "Enrique" [[2]] [1] "Miguel" [2] "Jose" [[3]] [1] "David" [2] "Pepe" Me gustaría obtener en qué elementos de la lista se encuentra cada nombre, es decir, quisiera obtener un resultado como el siguiente: "Pepe" está en el elemento 1 y 3 (lis[[1]] y lis[[3]]). "Miguel" está en el 1 y en el 2. "Enrique" está en el 1 ... y así sucesivamente. He estado probando distintas sentencias con la función grep pero no obtengo el resultado deseado, ¿alguien me puede dar alguna idea?. Muchas gracias, Guillermo
Hola. Seguro que hay muchas formas de hacerlo, pero si los elementos de tu lista son factores y tienen exactamente los mismos ''levels'', bastaría con: do.call("rbind", lapply(lis, function(x) table(x))) o si prefieres una lista como dices en la pregunta: aux <- as.list(as.data.frame(do.call("rbind", lapply(lis, function(x) table(x))))) lapply(aux, function(x) which(x > 0)) Si los elementos no son factores o no tienen los mismos niveles; puedes convertirlos a factores previamente: lis <- lapply(lis, function(x) {x <- factor(x, levels unique(unlist(lis))); x}) Un saludo El 18 de octubre de 2011 10:52, <Guillermo.Vinue@uv.es> escribió:> Hola, > > Tengo una lista, llamada lis, cuyos elementos son los siguientes: > > >lis > [[1]] > [1] "Pepe" > [2] "Miguel" > [3] "Enrique" > > [[2]] > [1] "Miguel" > [2] "Jose" > > [[3]] > [1] "David" > [2] "Pepe" > > Me gustaría obtener en qué elementos de la lista se encuentra cada > nombre, es decir, quisiera obtener un resultado como el siguiente: > > "Pepe" está en el elemento 1 y 3 (lis[[1]] y lis[[3]]). > "Miguel" está en el 1 y en el 2. > "Enrique" está en el 1 ... y así sucesivamente. > > He estado probando distintas sentencias con la función grep pero no > obtengo el resultado deseado, ¿alguien me puede dar alguna idea?. > > Muchas gracias, > > Guillermo > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >[[alternative HTML version deleted]]
Lo siguiente parece funcionar: > L=list(c("Pepe","Miguel","Enrique"),c("Miguel","Jose"),c ("David","Pepe")) > nombres=unique(unlist(L)) > nombres [1] "Pepe" "Miguel" "Enrique" "Jose" "David" > > for(i in 1:length(nombres)) { + index=sapply(L, function(x) match(nombres[i],x,nomatch =0) > 0) + cat(nombres[i],"está en la(s) listas(s)",which(index),"\n") + } Pepe está en la(s) listas(s) 1 3 Miguel está en la(s) listas(s) 1 2 Enrique está en la(s) listas(s) 1 Jose está en la(s) listas(s) 2 David está en la(s) listas(s) 3 -- ____________________________________ Olivier G. Nuñez Email: onunez en iberstat.es Tel : +34 663 03 69 09 Web: http://www.iberstat.es ____________________________________ El 18/10/2011, a las 10:52, <Guillermo.Vinue en uv.es> <Guillermo.Vinue en uv.es> escribió:> está en el elemento 1 y 3
Muchas gracias a los dos por la ayuda tan rápida. Los comandos de Javi no me dan el resultado que necesito, me parece que es porque los elementos de mi lista son de distinta longitud, sin embargo, todo lo que comenta me parece una forma muy elegante de intentar resolver el problema y que me servirá en futuros problemas con listas, de hecho, la función do.call no la conocía. Los comandos de Olivier sí que dan el resultado que quería. Muchas gracias de nuevo a ambos por la ayuda. Un saludo, Guillermo> Lo siguiente parece funcionar: > > > L=list(c("Pepe","Miguel","Enrique"),c("Miguel","Jose"),c > ("David","Pepe")) > > nombres=unique(unlist(L)) > > nombres > [1] "Pepe" "Miguel" "Enrique" "Jose" "David" > > > > for(i in 1:length(nombres)) { > + index=sapply(L, function(x) match(nombres[i],x,nomatch =0) > 0) > + cat(nombres[i],"está en la(s) listas(s)",which(index),"\n") > + } > Pepe está en la(s) listas(s) 1 3 > Miguel está en la(s) listas(s) 1 2 > Enrique está en la(s) listas(s) 1 > Jose está en la(s) listas(s) 2 > David está en la(s) listas(s) 3 > -- > ____________________________________ > > Olivier G. Nuñez > Email: onunez en iberstat.es > Tel : +34 663 03 69 09 > Web: http://www.iberstat.es > > ____________________________________ > > > > > El 18/10/2011, a las 10:52, <Guillermo.Vinue en uv.es> > <Guillermo.Vinue en uv.es> escribió: > > > está en el elemento 1 y 3 > > >