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....
46 Answers
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 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) 3df.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)) 2Take 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 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") You can give another name for transpose matrix
df.aree1 <- t(df.aree) df.aree1 <- as.data.frame(df.aree1) 1