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.