¿Cómo se reordenan las columnas en un marco de datos?

Resuelto Catherine asked hace 54 años • 0 respuestas

¿Cómo se cambiaría esta entrada (con la secuencia: hora, entrada, salida, archivos)?

Time   In    Out  Files
1      2     3    4
2      3     4    5

¿A esta salida (con la secuencia: tiempo, salida, entrada, archivos)?

Time   Out   In  Files
1      3     2    4
2      4     3    5

Aquí están los datos ficticios de R:

table <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
table
##  Time In Out Files
##1    1  2   3     4
##2    2  3   4     5
Catherine avatar Jan 01 '70 08:01 Catherine
Aceptado

Su marco de datos tiene cuatro columnas así df[,c(1,2,3,4)]. Tenga en cuenta que la primera coma significa mantener todas las filas y 1,2,3,4 se refiere a las columnas.

Para cambiar el orden como en la pregunta anterior, hagadf2[,c(1,3,2,4)]

Si desea generar este archivo como csv, hagawrite.csv(df2, file="somedf.csv")

richiemorrisroe avatar Sep 21 '2011 07:09 richiemorrisroe
# reorder by column name
data <- data[, c("A", "B", "C")] # leave the row index blank to keep all rows

#reorder by column index
data <- data[, c(1,3,2)] # leave the row index blank to keep all rows
Xavier Guardiola avatar Jun 22 '2012 14:06 Xavier Guardiola

También puedes utilizar la función de subconjunto:

data <- subset(data, select=c(3,2,1))

Es mejor que utilice el operador [] como en las otras respuestas, pero puede ser útil saber que puede realizar una operación de reordenamiento de subconjunto y columna en un solo comando.

Actualizar:

También puede utilizar la función de selección del paquete dplyr:

data = data %>% select(Time, out, In, Files)

No estoy seguro de la eficiencia, pero gracias a la sintaxis de dplyr esta solución debería ser más flexible, especialmente si tienes muchas columnas. Por ejemplo, lo siguiente reordenará las columnas del conjunto de datos mtcars en el orden opuesto:

mtcars %>% select(carb:mpg)

Y lo siguiente reordenará solo algunas columnas y descartará otras:

mtcars %>% select(mpg:disp, hp, wt, gear:qsec, starts_with('carb'))

Lea más sobre la sintaxis selecta de dplyr .

dalloliogm avatar Jul 03 '2012 13:07 dalloliogm

Como se menciona en este comentario , las sugerencias estándar para reordenar las columnas en a data.frameson generalmente engorrosas y propensas a errores, especialmente si tiene muchas columnas.

Esta función permite reorganizar las columnas por posición: especifique un nombre de variable y la posición deseada, y no se preocupe por las otras columnas.

##arrange df vars by position
##'vars' must be a named vector, e.g. c("var.name"=1)
arrange.vars <- function(data, vars){
    ##stop if not a data.frame (but should work for matrices as well)
    stopifnot(is.data.frame(data))

    ##sort out inputs
    data.nms <- names(data)
    var.nr <- length(data.nms)
    var.nms <- names(vars)
    var.pos <- vars
    ##sanity checks
    stopifnot( !any(duplicated(var.nms)), 
               !any(duplicated(var.pos)) )
    stopifnot( is.character(var.nms), 
               is.numeric(var.pos) )
    stopifnot( all(var.nms %in% data.nms) )
    stopifnot( all(var.pos > 0), 
               all(var.pos <= var.nr) )

    ##prepare output
    out.vec <- character(var.nr)
    out.vec[var.pos] <- var.nms
    out.vec[-var.pos] <- data.nms[ !(data.nms %in% var.nms) ]
    stopifnot( length(out.vec)==var.nr )

    ##re-arrange vars by position
    data <- data[ , out.vec]
    return(data)
}

Ahora la solicitud del OP se vuelve tan simple como esto:

table <- data.frame(Time=c(1,2), In=c(2,3), Out=c(3,4), Files=c(4,5))
table
##  Time In Out Files
##1    1  2   3     4
##2    2  3   4     5

arrange.vars(table, c("Out"=2))
##  Time Out In Files
##1    1   3  2     4
##2    2   4  3     5

Para intercambiar adicionalmente Timecolumnas Files, puede hacer esto:

arrange.vars(table, c("Out"=2, "Files"=1, "Time"=4))
##  Files Out In Time
##1     4   3  2    1
##2     5   4  3    2
landroni avatar May 03 '2016 16:05 landroni