¿Cómo cambiaría esta entrada (con la secuencia: tiempo, entrada, salida, archivos):
Time In Out Files
1 2 3 4
2 3 4 5
¿A esta salida (con la secuencia: tiempo, fuera, dentro, 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
help(Extract)
también conocido como?'['
Respuestas:
Su marco de datos tiene cuatro columnas como esta
df[,c(1,2,3,4)]
. Tenga en cuenta que la primera coma significa mantener todas las filas, y el 1,2,3,4 se refiere a las columnas.Para cambiar el orden como en la pregunta anterior, haga
df2[,c(1,3,2,4)]
Si desea generar este archivo como un csv, haga
write.csv(df2, file="somedf.csv")
fuente
df[,c(1,3,2,4:ncol(df))]
cuando no sabe cuántas columnas hay.fuente
data <- data[c(1,3,"Var1", 2)]
?c(1,3,"Var1", 2)
se leerá comoc("1","3","Var1", "2")
porque los vectores pueden contener datos de un solo tipo, por lo que los tipos se promueven al tipo más general presente. Debido a que no hay columnas con los nombres de los caracteres "1", "3", etc., obtendrá "columnas indefinidas".list(1,3,"Var1", 2)
mantiene los valores sin promoción de tipo, pero no puede usar alist
en el contexto anterior.mtcars[c(1,3,2)]
subconjunto? Hubiera esperado un error relacionado con dimensiones incorrectas o similares ... ¿No debería ser asímtcars[,c(1,3,2)]
?También puede usar la función de subconjunto:
Debería usar mejor el operador [] como en las otras respuestas, pero puede ser útil saber que puede hacer un subconjunto y una operación de reordenamiento de columna en un solo comando.
Actualizar:
También puede usar la función de selección del paquete dplyr:
No estoy seguro de la eficiencia, pero gracias a la sintaxis de dplyr, esta solución debería ser más flexible, especialmente si tiene muchas columnas. Por ejemplo, lo siguiente reordenará las columnas del conjunto de datos mtcars en el orden opuesto:
Y lo siguiente reordenará solo algunas columnas y descartará otras:
Lea más sobre la sintaxis select de dplyr .
fuente
subset()
, vea esta pregunta .everything()
particularmente impresionante;mtcars %>% select(wt, gear, everything())
Como se menciona en este comentario , las sugerencias estándar para reordenar columnas en a
data.frame
son 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.
Ahora la solicitud del OP se vuelve tan simple como esto:
Para intercambiar
Time
yFiles
columnas adicionalmente , puede hacer esto:fuente
Una
dplyr
solución (parte deltidyverse
conjunto de paquetes) es usarselect
:fuente
select(iris, Species, everything())
. También tenga en cuenta que las citas no son necesarias.everything()
como en el comentario dedplyr
'sgroup
también reorganizará las variables, así que ten cuidado cuando uses eso en una cadena.Tal vez sea una coincidencia que el orden de las columnas que desea tenga nombres de columnas en orden alfabético descendente. Como ese es el caso, simplemente podrías hacer:
Eso es lo que uso cuando tengo archivos grandes con muchas columnas.
fuente
!! WARNING !!
data.table
se convierteTARGET
en un vector int:TARGET <- TARGET[ , order(colnames(TARGET), decreasing=TRUE)]
para arreglar eso:TARGET <- as.data.frame(TARGET)
TARGET <- TARGET[ , order(colnames(TARGET), decreasing=TRUE)]
Puedes usar el paquete data.table :
Cómo reordenar columnas data.table (sin copiar)
fuente
Las tres respuestas mejor calificadas tienen una debilidad.
Si su marco de datos se ve así
entonces es una mala solución para usar
Hace el trabajo, pero acaba de introducir una dependencia en el orden de las columnas en su entrada.
Este estilo de programación frágil se debe evitar.
El nombramiento explícito de las columnas es una mejor solución
Además, si tiene la intención de reutilizar su código en una configuración más general, simplemente puede
lo cual también es bastante bueno porque aísla por completo los literales. Por el contrario, si usa dplyr's
select
entonces estarías configurando a aquellos que leerán tu código más tarde, incluido tú mismo, por un poco de engaño. Los nombres de columna se utilizan como literales sin aparecer en el código como tal.
fuente
dplyr
La versión1.0.0
incluye larelocate()
función para reordenar fácilmente las columnas:o
fuente
fuente
setcolorder
.El único que he visto funcionar bien es desde aquí .
Usar así:
Funciona de maravilla.
fuente