ChatGPT解决这个技术问题 Extra ChatGPT

Transpose a data frame

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....

Have you tried colnames(df.aree)<-df.aree[1,];df.aree<-df.aree[2:nrow(df.aree),]?
Data frames aren't naturally meant to be transposable. If yours is, then perhaps it should be in matrix form instead.
Agree; ting data frame is also quite inefficient. If you can, use matrix.
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.

T
Tommy

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

a
ah bon

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)

also, setnames(t_mtcars, rownames(mtcars)) would be the data.table-way of setting names on a data.table (and if using a data.table object you wouldn't set the rownames)
This is by far the best solution! +1.
such an eloquent solution using data.table, thanks!
F
Frank
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 If so, accept his answer by clicking a gray tick next to it.
one problem with this - column names take the numeric representation of the factor level.
G
Ghazal

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

B
BMLopes

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")

u
user438383

You can give another name for transpose matrix

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

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.