Transponuj ramkę danych

107

Muszę przetransponować dużą ramkę danych, więc użyłem:

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

Oto, co otrzymałem:

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    

Moim problemem są nowe nazwy kolumn (10428, 10760, 12148, 11865), które muszę wyeliminować, ponieważ muszę użyć pierwszego wiersza jako nazw kolumn.

Próbowałem z col.names()funkcją, ale nie otrzymałem tego, czego potrzebowałem.

Czy masz jakieś sugestie?

EDYTOWAĆ

Dzięki za Twoją sugestię!!! Korzystając z niej otrzymuję:

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

Teraz muszę przekształcić nazwy wierszy (GS ..) w kolumnie współczynnika ....

Riccardo
źródło
1
Czy próbowałeś colnames(df.aree)<-df.aree[1,];df.aree<-df.aree[2:nrow(df.aree),]?
5
Ramki danych nie są naturalnie przeznaczone do transpozycji. Jeśli tak, to być może powinno być w formie macierzy.
Richie Cotton
Zgodzić się; tTworzenie ramki danych jest również dość nieefektywne. Jeśli możesz, użyj matrix.
mbq
5
Transpozycja data.frame, która zawiera kolumnę łańcuchową, zamienia WSZYSTKIE wartości na łańcuchy! Niedobrze. Zobacz moją odpowiedź poniżej, aby obejść problem.
Tommy,

Odpowiedzi:

109

Lepiej nie transponuj data.frame, gdy znajduje się w niej kolumna nazwy - wszystkie wartości liczbowe zostaną zamienione na łańcuchy!

Oto rozwiązanie, które zachowuje liczby jako liczby:

# 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
źródło
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))
Szczery
źródło
@Riccardo Jeśli tak, zaakceptuj jego odpowiedź, klikając szary haczyk obok niej.
mbq
4
jeden problem z tym - nazwy kolumn przyjmują numeryczną reprezentację poziomu czynnika.
Harry Palmer
48

Możesz użyć transposefunkcji z data.tablebiblioteki. Proste i szybkie rozwiązanie, które zachowuje numericwartości jak 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
źródło
4
również setnames(t_mtcars, rownames(mtcars))byłby data.table-sposób ustawiania nazw w data.table (a jeśli używasz data.tableobiektu nie ustawiałbyś tego rownames)
SymbolixAU
To zdecydowanie najlepsze rozwiązanie! +1.
HelloWorld
1

Skorzystaj z 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
źródło