Transposer une trame de données

107

J'ai besoin de transposer une grande trame de données et j'ai donc utilisé:

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

Voici ce que j'obtiens:

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    

Mon problème est les nouveaux noms de colonne (10428, 10760, 12148, 11865) que je dois éliminer car je dois utiliser la première ligne comme noms de colonne.

J'ai essayé avec la col.names()fonction mais je n'ai pas obtenu ce dont j'avais besoin.

Avez-vous une suggestion?

ÉDITER

Merci pour votre suggestion !!! En l'utilisant, j'obtiens:

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

Maintenant, je dois transformer les noms de lignes (GS ..) dans une colonne de facteurs ....

Riccardo
la source
1
Avez-vous essayé colnames(df.aree)<-df.aree[1,];df.aree<-df.aree[2:nrow(df.aree),]?
5
Les trames de données ne sont pas naturellement destinées à être transposables. Si le vôtre l'est, il devrait peut-être être sous forme de matrice.
Richie Cotton
Se mettre d'accord; tla trame de données est également assez inefficace. Si vous le pouvez, utilisez la matrice.
mbq le
5
Transposer un data.frame qui contient une colonne de chaîne transforme TOUTES les valeurs en chaînes! Pas bon. Voir ma réponse ci-dessous pour une solution de contournement.
Tommy

Réponses:

109

Vous feriez mieux de ne pas transposer le data.frame tant que la colonne de nom y est - toutes les valeurs numériques seront alors transformées en chaînes!

Voici une solution qui conserve les nombres sous forme de nombres:

# 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
la source
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))
Franc
la source
@Riccardo Si oui, acceptez sa réponse en cliquant sur une coche grise à côté.
mbq le
4
un problème avec ceci - les noms de colonne prennent la représentation numérique du niveau de facteur.
Harry Palmer
48

Vous pouvez utiliser la transposefonction de la data.tablebibliothèque. Solution simple et rapide qui conserve les numericvaleurs comme 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
la source
4
aussi, setnames(t_mtcars, rownames(mtcars))serait la manière data.tablede définir des noms sur une table de données (et si vous utilisez un data.tableobjet, vous ne rownames
définiriez
C'est de loin la meilleure solution! +1.
HelloWorld
1

Profitez de 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
la source