使用R将行转换为列和列

时间:2015-02-23 18:42:05

标签: r rows transpose col

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

例如,此代码:

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

2 个答案:

答案 0 :(得分:24)

只需使用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返回一个矩阵。正如Mark建议用as.data.frame包装它时会返回数据帧而不是矩阵。谢谢!

答案 1 :(得分:2)

这是一个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_dftidyverse方法一起使用将引发有关丢弃属性的警告消息。这与将具有不同属性类型的列转换为单个字符列有关。 smiths数据不会发出该警告,因为除subject以外的所有列都是双精度的。

使用as.data.frame(t())的更早答案会将所有内容转换为一个因数 如果存在混合的列类型,除非添加了stringsAsFactors = FALSE, 而tidyverse选项默认情况下将所有内容转换为字符 有混合列类型。