Ordenación de data frames por columna
Ordene data frames completos usando order() y arrange() de dplyr.
Ordenación de data frames por columna es una lección gratuita de R Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de R Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de R Academy incluye 4 lecciones en total.
Ordenar un data frame por una columna
La forma estándar de base R para ordenar un data frame consiste en usar order() sobre la columna de interés y utilizar los índices resultantes para reordenar las filas. La coma después de los índices selecciona todas las columnas.
df <- data.frame(
name = c('Charlie', 'Alice', 'Bob', 'Diana'),
age = c(35, 28, 42, 31),
salary = c(55000, 48000, 72000, 61000)
)
df[order(df$age), ]Orden descendente mediante negación
Para las columnas numéricas, niegue la columna dentro de order() para invertir la dirección del orden. El signo menos invierte todos los valores, de modo que el máximo pasa a ser el mínimo a efectos de ordenación.
df <- data.frame(
name = c('Charlie', 'Alice', 'Bob', 'Diana'),
salary = c(55000, 48000, 72000, 61000)
)
# Highest salary first
df[order(-df$salary), ]Ordenación por varias columnas
Pase varias columnas a order() para ordenar primero según el criterio principal y después según el secundario. El segundo argumento resuelve los empates del primero. Esto equivale a ORDER BY col1, col2 de SQL.
df <- data.frame(
dept = c('Eng', 'HR', 'Eng', 'HR', 'Eng'),
name = c('Zara', 'Bob', 'Alice', 'Eve', 'Mike'),
salary = c(90000, 55000, 85000, 58000, 78000)
)
# Sort by dept, then by salary descending within dept
df[order(df$dept, -df$salary), ]Ordenar columnas de texto
Ordenar por una columna de texto funciona de la misma manera: order() gestiona el orden lexicográfico. Para obtener un orden alfabético inverso, use decreasing = TRUE en lugar de la negación (la negación solo funciona con valores numéricos).
df <- data.frame(
city = c('Paris', 'Athens', 'Berlin', 'London'),
pop_mil = c(2.1, 0.6, 3.6, 9.0)
)
# Alphabetical by city
df[order(df$city), ]
# Reverse alphabetical
df[order(df$city, decreasing = TRUE), ]Restablecer los números de fila después de ordenar
Después de ordenar, los nombres de fila reflejan las posiciones originales (por ejemplo, 3, 1, 4, 2). Para restablecerlos a enteros secuenciales a partir de 1, establezca row.names(df) <- NULL o envuelva el resultado en data.frame().
df <- data.frame(
x = c(30, 10, 20),
y = c('c', 'a', 'b')
)
sorted <- df[order(df$x), ]
cat('Before reset:\n'); print(sorted)
row.names(sorted) <- NULL
cat('After reset:\n'); print(sorted)Ordenar con valores NA
Cuando una columna de ordenación contiene NA, order() los coloca al final de forma predeterminada. Use na.last = FALSE para mover las filas con NA al principio o filt́relas antes.
df <- data.frame(
name = c('Alice', 'Bob', 'Carol', 'Dave'),
score = c(85, NA, 92, NA)
)
cat('NAs last (default):\n')
print(df[order(df$score), ])
cat('NAs first:\n')
print(df[order(df$score, na.last = FALSE), ])dplyr::arrange() como alternativa moderna
El paquete dplyr proporciona arrange() como una alternativa más clara. Aunque dplyr no forma parte de base R, conocer su sintaxis le ayuda a leer código moderno de R. Nota: isRunnable es true aquí únicamente para mostrar la sintaxis; es necesario instalar dplyr para ejecutarla.
# dplyr::arrange() syntax (requires dplyr installed)
# library(dplyr)
# df |> arrange(salary) # ascending
# df |> arrange(desc(salary)) # descending
# df |> arrange(dept, desc(salary)) # multi-column
# Equivalent base R:
df <- data.frame(dept=c('A','B','A'), salary=c(50,70,60))
df[order(df$dept, -df$salary), ]Ordenar factores según el orden de sus niveles
Las columnas de factores se ordenan según el orden de sus niveles, no alfabéticamente. Esto permite definir un orden personalizado estableciendo explícitamente los niveles del factor antes de ordenar.
df <- data.frame(
priority = factor(c('Low', 'High', 'Medium', 'High', 'Low'),
levels = c('Low', 'Medium', 'High')),
task = c('T1', 'T2', 'T3', 'T4', 'T5')
)
# Sorts by factor level (Low < Medium < High)
df[order(df$priority), ]Ordenar y seleccionar las primeras filas
Un patrón habitual consiste en ordenar un data frame y después tomar las primeras N filas con head() o las últimas N con tail(). Este es el equivalente en base R de ORDER BY ... LIMIT N de SQL.
df <- data.frame(
product = c('A', 'B', 'C', 'D', 'E'),
revenue = c(1200, 4500, 890, 3100, 2750)
)
# Top 3 by revenue
top3 <- head(df[order(-df$revenue), ], 3)
row.names(top3) <- NULL
print(top3)Ordenación in situ frente a ordenación asignada
La ordenación no modifica el data frame original: devuelve uno nuevo. Asigne siempre el resultado a una variable, ya sea una nueva o la original sobrescribiéndola. Sobrescribir el original está bien cuando ya no necesite la versión sin ordenar.
df <- data.frame(
x = c(3, 1, 4, 1, 5, 9),
y = c('c', 'a', 'd', 'b', 'e', 'i')
)
# Safe: assign to new variable
df_sorted <- df[order(df$x), ]
# Or overwrite original:
df <- df[order(df$x), ]
row.names(df) <- NULL
print(df)Flujo de trabajo completo de ordenación
A continuación se muestra un flujo de trabajo completo y realista para ordenar un data frame: ordenar a los empleados por el nombre del departamento en orden ascendente y después por el salario en orden descendente, restablecer los índices de fila y mostrar el resultado de forma clara.
employees <- data.frame(
name = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
dept = c('IT', 'HR', 'IT', 'HR', 'IT'),
salary = c(85000, 58000, 92000, 63000, 78000)
)
result <- employees[order(employees$dept, -employees$salary), ]
row.names(result) <- NULL
print(result)Comprobación rápida
¿Cómo se ordena un data frame df por una columna numérica df$salary en orden descendente usando base R?
Ordenar data frames: conclusiones clave
Conclusiones clave sobre la ordenación de data frames:
- Forma idiomática en base R:
df[order(df$col), ] - Descendente numérico: use la negación con
-dentro deorder(-df$col) - Descendente de texto: use el argumento
decreasing = TRUE - Varias columnas:
order(df$a, df$b); la ordenación secundaria resuelve los empates - Los factores se ordenan según el orden de niveles definido, no alfabéticamente
- Restablezca los nombres de fila con
row.names(df) <- NULLdespués de ordenar - Alternativa moderna:
dplyr::arrange()condesc()para ordenar de forma descendente
df <- data.frame(
name = c('Zara', 'Ana', 'Bob', 'Ana'),
score = c(90, 85, 92, 88)
)
# Sort by name asc, score desc
result <- df[order(df$name, -df$score), ]
row.names(result) <- NULL
print(result)Preguntas frecuentes
¿La lección «Ordenación de data frames por columna» es gratis?
Sí — el texto completo de «Ordenación de data frames por columna» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de R Academy, actualiza a CoddyKit PRO. El curso de R Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Ordenación de data frames por columna»?
Ordene data frames completos usando order() y arrange() de dplyr. Practicas R Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar R Academy?
No se requiere experiencia previa. R Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Ordenación de data frames por columna»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de R Academy?
Sí. Cada lección de R Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Ordenación de vectores con sort()
- order() para una ordenación flexible
- Asignación de rangos con rank()
- Ordenación de data frames por columna