Friday, February 15, 2013

Truco del mes: ordenar una base de datos en R

Los lunes en la tarde es un tiempo de ocio administrativo para mí... Cierro las puertas de la oficina y me concentro en asesorar a los estudiantes que realizan investigaciones conmigo... Cada lunes sucede lo mismo... es una de esas cosas que me sacan de quicio, pero a la vez me hacen reír: "¿es order o es sort?" - le pregunto al estudiante de turno. "Jum" - responde el estudiante.


Es sistemático, la misma pregunta, la misma respuesta, el mismo profesor, diferentes estudiantes. Y es que resulta que, dado que me gusta el muestreo, las bases de datos son el pan de cada lunes. Por supuesto, el software de rigor es R.


Mi reacción ante esa situación siempre es la misma: llamar a Jorge Ortiz, para que me refresque la memoria. La reacción de Jorge, curiosamente, también es exactamente igual en cada ocasión: "Andrés, le envié un correo con un ejemplo"... Ahora que lo pienso bien, siempre es el mismo correo, y el mismo ejemplo.


Para todos ustedes, desde mi correo electrónico, el ejemplo de Jorge:



# ---- Ejemplo de base de datos Base con 4 variables: Id, A, B, C
N = 100
Base = data.frame(Id = 1:N, A = rbinom(N, 5, 0.5), B = rnorm(N, 160, 10), C = runif(N, 100, 200))

View(Base)

Imagen1


Como pueden notar, esta base de datos tiene cuatro variables y el objetivo es ordenarla por la variable B. Ahora, viene lo que realmente es importante, la función que hace el ordenamiento es order.
# ---- Se quiere ordenar la base por por la columna B
Orden_B = order(Base$B)
BaseOrdenada = Base[Orden_B,]

View(BaseOrdenada)

Imagen2


Y listo... Además, para ordenar de forma anidada sólo se debe añadir una segunda variable (o tantas variables como sea necesario) a la función order:
Orden_AC = order(Base$A, Base$C)
BaseOrdenada_AC = Base[Orden_AC,]

View(BaseOrdenada_AC)

Imagen1


4 comments:

  1. Buenos días Andrés:
    Podrías compartirme, por favor, dos temas claves para mi diario quehacer:
    a) Un buen libro introductorio a "R"
    b) Ordenar bases por diversos criterios, anidados
    Gracias,
    M. Da Silva M.

    ReplyDelete
  2. Para ordenar de forma anidada sólo tienes que añadir una segunda variable (o las variables que desees) a la función order:

    Orden_AB = order(Base$A, Base$B)
    BaseOrdenada_AB = Base[Orden_AB,]
    View(BaseOrdenada)

    ReplyDelete
  3. Hola Andrés,

    Otra forma que da mayores libertades cuando la cosa es más compleja, es utilizar la sintaxis de SQL. Por ejemplo:

    >library(sqldf)
    >sqldf("select * from Base order by B")
    >sqldf("select * from Base order by A,C")

    El par de sentencias luego de la llamada a la librería sqldf recrean los ejemplos que proporcionas.

    También se hace más fácil cuando se está interesado en dar grandes sumarios, por ejemplo, dejo la siguiente sentencia:

    > sqldf("select A,count(*), sum(B), avg(C) from Base group by A")

    Saludos.

    ReplyDelete
  4. Muy util el post, pero al momento de graficar con ese nuevo orden lo grafica sale como si no lo hubiera ordenado.
    Me podría ayudar gracias

    ReplyDelete