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.

John Clark
fuente

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.

James
fuente
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(.)))
Andrew Brēza
fuente
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")]
MANOJ KUMAR
fuente
6
  test[,sort(names(test))]

ordenar por nombres de columnas puede funcionar fácilmente.

Shalini Baranwal
fuente
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())
Xavier Jiménez Albán
fuente
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")))]
Tom Wagstaff
fuente
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

demarsylvain
fuente
1

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

sort(colnames(test[1:ncol(test)] ))
KNN
fuente
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())

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

Brit
fuente