Trasponi un data frame


107

Ho bisogno di trasporre un frame di dati di grandi dimensioni e quindi ho usato:

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

Questo è quello che ottengo:

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    

Il mio problema sono i nuovi nomi di colonna (10428, 10760, 12148, 11865) che devo eliminare perché devo utilizzare la prima riga come nomi di colonna.

Ho provato con la col.names()funzione ma non ho ottenuto quello che mi serve.

Hai qualche suggerimento?

MODIFICARE

Grazie per il tuo suggerimento !!! Usandolo ottengo:

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

Ora devo trasformare i nomi delle righe (GS ..) in una colonna di fattori ....


1
Hai provato colnames(df.aree)<-df.aree[1,];df.aree<-df.aree[2:nrow(df.aree),]?

5
I data frame non sono naturalmente pensati per essere trasponibili. Se il tuo è, forse dovrebbe essere invece in forma di matrice.
Richie Cotton

Essere d'accordo; tanche il data frame è abbastanza inefficiente. Se puoi, usa matrix.
MBQ

5
Trasporre un data.frame che contiene una colonna di stringhe trasforma TUTTI i valori in stringhe! Non bene. Vedi la mia risposta di seguito per una soluzione.
Tommy

Risposte:


109

Faresti meglio a non trasporre data.frame mentre la colonna del nome è al suo interno - tutti i valori numerici verranno quindi trasformati in stringhe!

Ecco una soluzione che mantiene i numeri come numeri:

# 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

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))

@Riccardo In tal caso, accetta la sua risposta facendo clic sul segno di spunta grigio accanto ad essa.
MBQ

4
un problema con questo: i nomi delle colonne prendono la rappresentazione numerica del livello del fattore.
Harry Palmer

48

È possibile utilizzare la transposefunzione dalla data.tablelibreria. Soluzione semplice e veloce che mantiene i numericvalori come 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)

4
inoltre, setnames(t_mtcars, rownames(mtcars))sarebbe il modo data.tabledi impostare i nomi su un data.table (e se si utilizza un data.tableoggetto non si imposterebbe il rownames)
SymbolixAU

Questa è di gran lunga la soluzione migliore! +1.
HelloWorld

1

Approfitta di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.