22

我有一个具有唯一行名和唯一列名的数据框。我想将行转换为列,将列转换为行。

例如,这段代码:

starting_df <- data.frame(row.names= c(LETTERS[1:4]),
                          a = c(1:4),
                          b = seq(0.02,0.08,by=0.02),
                          c = c("Aaaa","Bbbb","Cccc","Dddd")
                )

结果如下:

> starting_df
  a    b    c
A 1 0.02 Aaaa
B 2 0.04 Bbbb
C 3 0.06 Cccc
D 4 0.08 Dddd

我想将它转换为另一个包含完全相同数据的数据框,除了以前的行现在是列,反之亦然:

> final_df
     A    B    C    D
a    1    2    3    4
b 0.02 0.04 0.06 0.08
c Aaaa Bbbb Cccc Dddd
4

2 回答 2

47

只需使用基本转置功能t,包装as.data.frame

final_df <- as.data.frame(t(starting_df))
final_df
     A    B    C    D
a    1    2    3    4
b 0.02 0.04 0.06 0.08
c Aaaa Bbbb Cccc Dddd

以上更新。正如 docendo discimus 指出的那样,t返回一个矩阵。正如马克建议的那样,用它包装它as.data.frame会返回一个数据框而不是一个矩阵。谢谢!

于 2015-02-23T18:42:04.783 回答
3

这是一个tidyverse可能会根据数据起作用的选项,以及对其使用的一些警告:

library(tidyverse)

starting_df %>% 
  rownames_to_column() %>% 
  gather(variable, value, -rowname) %>% 
  spread(rowname, value)

rownames_to_column()如果原始数据帧具有有意义的行名,则必须这样做,否则新转置数据帧中的新列名将是与原始行号相对应的整数。如果没有有意义的行名,您可以跳过rownames_to_column()并替换rowname为数据框中第一列的名称,假设这些值是唯一且有意义的。使用tidyr::smiths样本数据将是:

smiths %>% 
    gather(variable, value, -subject) %>% 
    spread(subject, value)

starting_df使用该方法的示例tidyverse将引发有关删除属性的警告消息。这与将具有不同属性类型的列转换为单个字符列有关。smiths数据不会给出警告,因为除此之外的所有列都是subject双精度的。

如果存在混合列类型,除非添加,否则较早的答案 usingas.data.frame(t())会将所有内容转换为因子,而如果存在混合列类型,则默认情况下该选项会将所有内容转换为字符。stringsAsFactors = FALSEtidyverse

于 2020-02-16T17:12:50.177 回答