转置数据帧


107

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

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),]吗?

5
数据帧并非天生就意味着可转置。如果是,则应该改为矩阵形式。
Richie Cotton

同意; t数据帧的效率也很低。如果可以,请使用矩阵。
mbq 2011年

5
转换其中包含字符串列的data.frame会将所有值转换为字符串!不好。解决方法请参见下面的答案。
汤米”,

Answers:


109

您最好不要在name列位于其中的情况下转置data.frame,然后所有数字值都将转换为字符串!

这是将数字保留为数字的解决方案:

# 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如果是这样,请单击旁边的灰色勾号接受他的回答。
mbq 2011年

4
这样做的一个问题-列名采用因子级别的数字表示。
哈里·帕尔默

48

您可以使用库中的transpose函数data.table。简单快速的解决方案,将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)

4
setnames(t_mtcars, rownames(mtcars))将是data.table一个data.table设置名称(如果使用的三通data.table你不会设置对象rownames
SymbolixAU

到目前为止,这是最好的解决方案!+1。
HelloWorld '18

1

利用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.