Transponer un marco de datos

107

Necesito transponer un marco de datos grande y por eso usé:

df.aree <- t(df.aree)
df.aree <- as.data.frame(df.aree)

Esto es lo que obtengo:

df.aree[c(1:5),c(1:5)]
                         10428        10760        12148        11865
    name                M231T3       M961T5       M960T6      M231T19
    GS04.A        5.847557e+03 0.000000e+00 3.165891e+04 2.119232e+04
    GS16.A        5.248690e+04 4.047780e+03 3.763850e+04 1.187454e+04
    GS20.A        5.370910e+03 9.518396e+03 3.552036e+04 1.497956e+04
    GS40.A        3.640794e+03 1.084391e+04 4.651735e+04 4.120606e+04    

Mi problema son los nuevos nombres de columna (10428, 10760, 12148, 11865) que necesito eliminar porque necesito usar la primera fila como nombres de columna.

Probé con la col.names()función pero no obtuve lo que necesito.

¿Tienes alguna sugerencia?

EDITAR

¡¡¡Gracias por tu sugerencia!!! Usándolo obtengo:

df.aree[c(1:5),c(1:5)]
                        M231T3       M961T5       M960T6      M231T19
    GS04.A        5.847557e+03 0.000000e+00 3.165891e+04 2.119232e+04
    GS16.A        5.248690e+04 4.047780e+03 3.763850e+04 1.187454e+04
    GS20.A        5.370910e+03 9.518396e+03 3.552036e+04 1.497956e+04
    GS40.A        3.640794e+03 1.084391e+04 4.651735e+04 4.120606e+04
    GS44.A        1.225938e+04 2.681887e+03 1.154924e+04 4.202394e+04

Ahora necesito transformar los nombres de las filas (GS ..) en una columna de factor ....

Riccardo
fuente
1
¿Usted ha intentado colnames(df.aree)<-df.aree[1,];df.aree<-df.aree[2:nrow(df.aree),]?
5
Los marcos de datos no están diseñados para ser transponibles. Si el tuyo lo es, entonces quizás debería estar en forma de matriz.
Richie Cotton
De acuerdo; ting marco de datos también es bastante ineficiente. Si puede, use matrix.
mbq
5
Transponer un data.frame que contiene una columna de cadena convierte TODOS los valores en cadenas. No está bien. Vea mi respuesta a continuación para una solución alternativa.
Tommy

Respuestas:

109

Será mejor que no transponga el data.frame mientras la columna de nombre está en él; ¡todos los valores numéricos se convertirán en cadenas!

Aquí hay una solución que mantiene los números como números:

# first remember the names
n <- df.aree$name

# transpose all but the first column (name)
df.aree <- as.data.frame(t(df.aree[,-1]))
colnames(df.aree) <- n
df.aree$myfactor <- factor(row.names(df.aree))

str(df.aree) # Check the column types
Tommy
fuente
49
df.aree <- as.data.frame(t(df.aree))
colnames(df.aree) <- df.aree[1, ]
df.aree <- df.aree[-1, ]
df.aree$myfactor <- factor(row.names(df.aree))
Franco
fuente
@Riccardo Si es así, acepte su respuesta haciendo clic en una marca gris junto a ella.
mbq
4
un problema con esto: los nombres de las columnas toman la representación numérica del nivel del factor.
Harry Palmer
48

Puede utilizar la transposefunción de la data.tablebiblioteca. Solución sencilla y rápida que mantiene los numericvalores como numeric.

library(data.table)

# get data
  data("mtcars")

# transpose
  t_mtcars <- transpose(mtcars)

# get row and colnames in order
  colnames(t_mtcars) <- rownames(mtcars)
  rownames(t_mtcars) <- colnames(mtcars)
rafa.pereira
fuente
4
también, setnames(t_mtcars, rownames(mtcars))sería la forma data.tablede establecer nombres en una tabla de datos (y si usa un data.tableobjeto, no establecería el rownames)
SymbolixAU
¡Esta es, con mucho, la mejor solución! +1.
HelloWorld
1

Aprovecha as.matrix:

# keep the first column 
names <-  df.aree[,1]

# Transpose everything other than the first column
df.aree.T <- as.data.frame(as.matrix(t(df.aree[,-1])))

# Assign first column as the column names of the transposed dataframe
colnames(df.aree.T) <- names
Ghazal
fuente