En R, tengo una lista de objetos no triviales (no son objetos simples como escalares de los que se puede esperar que R pueda definir una orden). Quiero ordenar la lista La mayoría de los lenguajes permiten que el programador proporcione una función o similar que compare un par de elementos de lista que se pasan a una función de clasificación. ¿Cómo puedo ordenar mi lista?Ordene una lista de elementos no triviales en R
Respuesta
Para hacer esto es tan simple que puedo decir que sus objetos son listas con dos elementos, un nombre y un valor. El valor es numérico; eso es lo que queremos ordenar. Puede imaginarse tener más elementos y la necesidad de hacer algo más complejo de ordenar.
La página de ayuda sort
nos dice que sort
utiliza xtfrm
; xtfrm
a su vez nos dice que utilizará los métodos ==
y >
para la clase de x[i]
.
En primer lugar voy a definir un objeto que quiero para ordenar:
xx <- lapply(c(3,5,7,2,4), function(i) list(name=LETTERS[i], value=i))
class(xx) <- "myobj"
Ahora, ya xtfrm
trabajos sobre los x[i]
's, necesito definir una función que devuelve [
los elementos deseados, pero aún con la clase derecha
`[.myobj` <- function(x, i) {
class(x) <- "list"
structure(x[i], class="myobj")
}
Ahora necesitamos ==
y >
funciones para la clase myobj
; esto potencialmente podría ser más inteligente al vectorizar estos adecuadamente; pero para la función de clasificación, sabemos que solo vamos a pasar myobj
de longitud 1, así que solo usaré el primer elemento para definir las relaciones.
`>.myobj` <- function(e1, e2) {
e1[[1]]$value > e2[[1]]$value
}
`==.myobj` <- function(e1, e2) {
e1[[1]]$value == e2[[1]]$value
}
Ahora sort
just works.
sort(xx)
Podría considerarse más adecuada para escribir una función completa Ops
para su objeto; sin embargo, para ordenar, esto parece ser todo lo que necesitas. Consulte p.89-90 en Venables/Ripley para obtener más información sobre cómo hacerlo utilizando el estilo S3. Además, si puede escribir fácilmente una función xtfrm
para sus objetos, eso sería más simple y probablemente más rápido.
Gracias Aaron. Fantástica respuesta. – Chris
Eso es mucho trabajo para construir una solución menos general que la que se puede construir con bits R regulares: estos son dos usos de 'orden' que ordenan primero el valor: 'xx [orden (como.caracter (sapply (xx," ["," value ")))]', y luego en el nombre: 'xx [orden (como.carácter (sapply (xx, "[", "name")))] 'sin ninguna referencia a los métodos de clase. –
@DWin tiene toda la razón; si puedes hacer algo más inteligente, ¡deberías! – Aaron
La función order
le permitirá determinar el orden de los caracteres o los argumentos numéricos y romper los lazos con los argumentos subsiguientes. Debes ser más específico sobre lo que quieres. Produzca un ejemplo de un "objeto no trivial" y especifique el orden que desea en algún objeto R. Las listas son probablemente la mayoría de los objetos no vectorial:
> slist <- list(cc=list(rr=1), bb=list(ee=2, yy=7), zz="ww")
> slist[order(names(slist))] # alpha order on names()
$bb
$bb$ee
[1] 2
$bb$yy
[1] 7
$cc
$cc$rr
[1] 1
$zz
[1] "ww"
slist[c("zz", "bb", "cc")] # an arbitrary ordering
$zz
[1] "ww"
$bb
$bb$ee
[1] 2
$bb$yy
[1] 7
$cc
$cc$rr
[1] 1
Una opción es crear un método xtfrm
para sus objetos. Las funciones como order
toman múltiples columnas que funcionan en algunos casos. También hay algunas funciones especializadas para casos específicos como mixedsort
en el paquete gtools
.
- 1. Ordene una lista de punteros
- 2. Ordene los elementos del cuadro de lista en C#
- 3. Ordene una sola lista vinculada
- 4. asignaciones Dozer no triviales
- 5. R: elementos de división de una lista en sublistas
- 6. R rep() en Python (replica elementos de una lista/vector)
- 7. - Ordene una matriz con elementos distintos de LogLogN
- 8. Cómo hacer que una clase JXTreeTable ordene sus elementos superiores
- 9. elementos hallazgo no en una lista
- 10. Ordene una lista que contenga una clase personalizada
- 11. R. cómo hacer una lista de listas en R?
- 12. R: convertir elementos de la lista en objetos
- 13. Ordene una lista con múltiples condiciones Ruby on Rails
- 14. Tutoriales de Pygames modernos, no triviales
- 15. R: subíndice no válido 'lista'
- 16. devolver una lista de elementos de una lista en OCaml
- 17. Sumando elementos en una lista
- 18. Cómo subconjunto de una lista en R
- 19. Seleccionar elementos múltiples de una lista
- 20. R: convertir la lista asimétrica en matriz - el número de elementos en cada sub-lista difiere
- 21. Cómo hacer una lista de vectores enteros en R
- 22. Euler 160: Encuentre los 5 dígitos no triviales del factorial
- 23. Crear una lista en un bucle en R - obtener nombres de elementos correctos
- 24. Eliminar elementos de una lista en otra
- 25. elementos divididos de una lista en python
- 26. Agregar elementos en una lista de diccionarios
- 27. Cómo evitar un bucle en R: seleccionando elementos de una lista
- 28. R: guardar ggplot2 gráficas en una lista
- 29. LINQ Unirse para buscar elementos NO EN una lista
- 30. elementos únicos en una lista de haskell
¿Puedes proporcionar un fragmento de esta lista de elementos no triviales para que otros tengan una idea de lo que estás hablando? Consejos para escribir una pregunta reproducible aquí: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Chase