125

I need to transpose a large data frame and so I used:

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

This is what I obtain:

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    

My problem is the new column names(10428, 10760, 12148, 11865) that I need to eliminate because I need to use the first row as column names.

I tried with col.names() function but I haven't obtain what I need.

Do you have any suggestion?

EDIT

Thanks for your suggestion!!! Using it I obtain:

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

Now I need to transform the row names(GS..) in a factor column....

Jaap
  • 77,147
  • 31
  • 174
  • 185
Riccardo
  • 1,795
  • 3
  • 14
  • 20
  • 1
    Have you tried `colnames(df.aree) –  Jul 21 '11 at 15:54
  • 5
    Data frames aren't naturally meant to be transposable. If yours is, then perhaps it should be in matrix form instead. – Richie Cotton Jul 21 '11 at 16:01
  • Agree; `t`ing data frame is also quite inefficient. If you can, use matrix. – mbq Jul 21 '11 at 16:31
  • 5
    Transposing a data.frame that contains a string column in it turns ALL values into strings! NOT good. See my answer below for a work-around. – Tommy Jul 21 '11 at 16:50

6 Answers6

126

You'd better not transpose the data.frame while the name column is in it - all numeric values will then be turned into strings!

Here's a solution that keeps numbers as numbers:

# 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
  • 38,649
  • 12
  • 87
  • 83
76

You can use the transpose function from the data.table library. Simple and fast solution that keeps numeric values as 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
  • 12,015
  • 4
  • 67
  • 101
50
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))
Frank
  • 2,728
  • 19
  • 29
3

Take advantage of 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
  • 537
  • 5
  • 11
2

With tidyr, one can transpose a dataframe with "pivot_longer" and then "pivot_wider".

To transpose the widely used mtcars dataset, you should first transform rownames to a column (the function rownames_to_column creates a new column, named "rowname").

library(tidyverse)

mtcars %>% 
rownames_to_column() %>% 
pivot_longer(!rowname, names_to = "col1", values_to = "col2") %>% 
pivot_wider(names_from = "rowname", values_from = "col2")
BMLopes
  • 476
  • 5
  • 10
0

You can give another name for transpose matrix

df.aree1 <- t(df.aree)
df.aree1 <- as.data.frame(df.aree1)
user438383
  • 4,338
  • 6
  • 23
  • 35
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Jan 05 '22 at 06:54