Ordenar columnas de un marco de datos por nombre de columna


93

Esta es posiblemente una pregunta simple, pero no sé cómo ordenar las columnas alfabéticamente.

test = data.frame(C = c(0, 2, 4, 7, 8), A = c(4, 2, 4, 7, 8), B = c(1, 3, 8, 3, 2))

#   C A B
# 1 0 4 1
# 2 2 2 3
# 3 4 4 8
# 4 7 7 3
# 5 8 8 2

Me gusta ordenar las columnas por nombres de columna alfabéticamente, para lograr

#   A B C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Para otros, quiero mi propio orden definido:

#   B A C
# 1 4 1 0
# 2 2 3 2
# 3 4 8 4
# 4 7 3 7
# 5 8 2 8

Tenga en cuenta que mis conjuntos de datos son enormes, con 10000 variables. Por tanto, el proceso debe estar más automatizado.

Respuestas:


137

Puede usar orderen names, y usar eso para ordenar las columnas al crear subconjuntos:

test[ , order(names(test))]
  A B C
1 4 1 0
2 2 3 2
3 4 8 4
4 7 3 7
5 8 2 8

Para su propio orden definido, necesitará definir su propio mapeo de los nombres al orden. Esto dependería de cómo le gustaría hacer esto, pero cambiar cualquier función a esto con la orderanterior debería dar el resultado deseado.

Por ejemplo, puede echar un vistazo a Ordenar las filas de un marco de datos de acuerdo con un vector de destino que especifica el orden deseado , es decir, puede matchsu marco de datos namescontra un vector de destino que contenga el orden de columna deseado.


3
Para elaborar, prueba [, c (2,3,1)] o prueba [, c ('A', 'B', 'C')] producirá el orden de las columnas A, B, C. El operador "[" es muy inteligente para determinar lo que quiere hacer.
Carl Witthoft

2
gracias, resolví la segunda pregunta con la ayuda proporcionada; myorder = c ("B", "A", "C"), prueba [, myorder]
John Clark

¿Hay alguna forma de ordenar las columnas de la forma que yo desee (por ejemplo, CAB)?
TYZ

Puede aprovechar el hecho de que un data.frame es una lista y hacerlo más simple :: test[ order(names(test)) ]
ctbrown

1
@naco Ninguno, lee la fuente de colnames: termina pidiendo namesun data.frame.
James

27

Aquí está la dplyrrespuesta obligatoria en caso de que alguien quiera hacer esto con la tubería.

test %>% 
    select(sort(names(.)))

4
Para mí, esto funcionó bien ya que es fácil seleccionar las variables que quiero primero. Cumpliendo con el df original: test%>%select(b,sort(names(.)))lo pondrá como "b, a, c"
Silentdevildoll

@Silentdevildoll ¡es una aplicación genial! No pensé en eso.
Andrew Brēza

14
test = data.frame(C=c(0,2,4, 7, 8), A=c(4,2,4, 7, 8), B=c(1, 3, 8,3,2))

Se puede realizar el reemplazo de la función siguiente simple (pero solo si el marco de datos no tiene muchas columnas):

test <- test[, c("A", "B", "C")]

para otros:

test <- test[, c("B", "A", "C")]


4

Si solo desea una o más columnas al frente y no le importa el orden del resto:

require(dplyr)
test %>%
  select(B, everything())

2

Entonces, para tener una columna específica primero, luego el resto alfabéticamente, propondría esta solución:

test[, c("myFirstColumn", sort(setdiff(names(test), "myFirstColumn")))]

y si desea que más de una columna sea la primera, ¿entonces qué?
Maksym Moroz

2

Una opción alternativa es usar str_sort()desde la biblioteca stringr , con el argumento numeric = TRUE. Esto ordenará correctamente las columnas que incluyan números no solo alfabéticamente :

str_sort(c("V3", "V1", "V10"), numeric = TRUE)

# [1] V1 V3 V11


1

Similar a la sintaxis anterior, pero para aprender, ¿puede ordenar por nombres de columna?

sort(colnames(test[1:ncol(test)] ))

No [1:ncol(test)]está haciendo nada aquí, es solo una forma más larga de escribir sort(colnames(test)).
Gregor Thomas

0

Esto es lo que descubrí para lograr un problema similar con mi conjunto de datos.

Primero, haga lo que James mencionó anteriormente, es decir

test[ , order(names(test))]

En segundo lugar, use la función everything () en dplyr para mover columnas específicas de interés (por ejemplo, "D", "G", "K") al comienzo del marco de datos, colocando las columnas ordenadas alfabéticamente después de esas.

select(test, D, G, K, everything())

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.