Transponieren Sie einen Datenrahmen


107

Ich muss einen großen Datenrahmen transponieren und habe folgendes verwendet:

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

Folgendes erhalte ich:

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    

Mein Problem sind die neuen Spaltennamen (10428, 10760, 12148, 11865), die ich entfernen muss, da ich die erste Zeile als Spaltennamen verwenden muss.

Ich habe es mit col.names()Funktion versucht , aber ich habe nicht das bekommen, was ich brauche.

Hast du irgendwelche Vorschläge?

BEARBEITEN

Danke für Ihren Vorschlag!!! Damit erhalte ich:

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

Jetzt muss ich die Zeilennamen (GS ..) in eine Faktorspalte umwandeln ....


1
Hast du es versucht colnames(df.aree)<-df.aree[1,];df.aree<-df.aree[2:nrow(df.aree),]?

5
Datenrahmen sollen natürlich nicht transponierbar sein. Wenn dies bei Ihnen der Fall ist, sollte es möglicherweise stattdessen in Matrixform vorliegen.
— Richie Cotton

Zustimmen; tDer Datenrahmen ist auch ziemlich ineffizient. Wenn Sie können, verwenden Sie Matrix.
— mbq

5
Durch das Transponieren eines data.frame, der eine Zeichenfolgenspalte enthält, werden ALLE Werte in Zeichenfolgen umgewandelt! Nicht gut. Siehe meine Antwort unten für eine Problemumgehung.
— Tommy

Antworten:


108

Sie sollten den data.frame besser nicht transponieren, während sich die Namensspalte darin befindet - alle numerischen Werte werden dann in Zeichenfolgen umgewandelt!

Hier ist eine Lösung, bei der Zahlen als Zahlen beibehalten werden:

# 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 Wenn ja, akzeptieren Sie seine Antwort, indem Sie auf ein graues Häkchen daneben klicken.
— mbq

4
Ein Problem dabei ist, dass Spaltennamen die numerische Darstellung der Faktorebene übernehmen.
— Harry Palmer

48

Sie können die transposeFunktion aus der data.tableBibliothek verwenden. Einfache und schnelle Lösung, die numericWerte wie hält 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
Auch setnames(t_mtcars, rownames(mtcars))wäre der data.table-Wege von Namen auf einem data.table (und bei Verwendung ein Einstellung data.tableObjekt , das Sie das nicht eingestellt würde rownames)
— SymbolixAU

Dies ist bei weitem die beste Lösung! +1.
— HelloWorld

1

Nutzen Sie 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.