转置数据框

133

我需要转置一个大型的数据框,所以我使用了:

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

这是我得到的结果:
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    

我的问题是需要消除的新列名(10428、10760、12148、11865),因为我需要使用第一行作为列名。

我尝试使用col.names()函数,但没有得到我需要的结果。

你有什么建议吗?

编辑

谢谢你的建议!使用它,我得到了:

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

现在我需要将行名(GS..)转换为因子列....

1
你尝试过使用 colnames(df.aree)<-df.aree[1,];df.aree<-df.aree[2:nrow(df.aree),] 吗? - user554546
5
数据框本质上并不适合进行转置。如果您的数据可以转置,那么可能应该将其转换为矩阵形式。 - Richie Cotton
同意;使用数据框t也相当低效。如果可以的话,请使用矩阵。 - mbq
5
将包含字符串列的数据框转置会将所有值都转换为字符串!这样做不好。请参见下面的答案以获取解决方法。 - Tommy
6个回答

135

当数据框中存在名称列时,最好不要转置 - 所有数字值都将被转换为字符串!

以下是一个保持数字为数字的解决方案:

# 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

如果您想在 data.frame 中使用 transpose,可以使用 df <- df %>% mutate_if(is.character,as.numeric) 将字符转换回数字。 - Dan Tarr

84
你可以使用来自data.table库的transpose函数。这是一个简单快速的解决方案,可以将numeric值保留为numeric。

你可以使用来自data.table库的transpose函数。这是一个简单且快速的解决方案,可以将numeric值保留为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)

6
另外,setnames(t_mtcars, rownames(mtcars)) 是在 data.table 中设置列名的方式(如果使用 data.table 对象,则不需要设置行名)。 - SymbolixAU
2
此外,在data.table :: transpose中,您可以使用参数make.names来选择列(通常是字符向量),其名称将成为转置数据框的列名称。您还可以使用参数keep.names来为新列选择列名(一个字符向量),该列将存储来自预转置数据框的以前列名。 - Brandon

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

@Riccardo 如果是这样,请点击旁边的灰色勾号接受他的回答。 - mbq
4
问题在于列名采用了因子水平的数值表示。 - Harry Palmer

5
使用 tidyr,可以使用 "pivot_longer" 和 "pivot_wider" 转置数据框。
要转置常用的 mtcars 数据集,首先需要将行名转换为列(函数 rownames_to_column 创建一个名为 "rowname" 的新列)。
library(tidyverse)

mtcars %>% 
rownames_to_column() %>% 
pivot_longer(!rowname, names_to = "col1", values_to = "col2") %>% 
pivot_wider(names_from = "rowname", values_from = "col2")

4

利用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

0

你可以为转置矩阵指定另一个名称

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

1
目前你的回答写得不够清晰,请[编辑]以增加更多细节,帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好的答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接