Transpor um quadro de dados


107

Preciso transpor um grande quadro de dados e usei:

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

Isso é o que eu obtenho:

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    

Meu problema são os novos nomes de coluna (10428, 10760, 12148, 11865) que preciso eliminar porque preciso usar a primeira linha como nomes de coluna.

Tentei com a col.names()função mas não obtive o que preciso.

Você tem alguma sugestão?

EDITAR

Obrigado por sua sugestão!!! Usando-o eu obtenho:

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

Agora preciso transformar os nomes das linhas (GS ..) em uma coluna de fator ....


1
Você já tentou colnames(df.aree)<-df.aree[1,];df.aree<-df.aree[2:nrow(df.aree),]?

5
Os frames de dados não são naturalmente transponíveis. Se o seu for, então talvez deva ser em forma de matriz.
Richie Cotton

Aceita; ting frame de dados também é bastante ineficiente. Se você puder, use a matriz.
mbq

5
Transpor um data.frame que contém uma coluna de string transforma TODOS os valores em strings! Não é bom. Veja minha resposta abaixo para uma solução alternativa.
Tommy

Respostas:


109

É melhor você não transpor data.frame enquanto a coluna de nome estiver nele - todos os valores numéricos serão transformados em strings!

Esta é uma solução que mantém os números como números:

# 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 Em caso afirmativo, aceite sua resposta clicando em uma marca cinza ao lado dela.
mbq

4
um problema com isso - os nomes das colunas tomam a representação numérica do nível do fator.
Harry Palmer de

48

Você pode usar o transpose função da data.tablebiblioteca. Solução simples e rápida que mantém os numericvalores como 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
também, setnames(t_mtcars, rownames(mtcars))seria a forma data.tablede definir nomes em um data.table (e se estiver usando um data.tableobjeto, você não rownames
definiria

Esta é de longe a melhor solução! +1.
HelloWorld

1

Aproveite 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.