使用R将行转换为列和列

Chr*_*oms 12 transpose r rows 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")
                )
Run Code Online (Sandbox Code Playgroud)

结果如下:

> 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
Run Code Online (Sandbox Code Playgroud)

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

> 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
Run Code Online (Sandbox Code Playgroud)

Chr*_*oms 27

只需使用基本转置功能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
Run Code Online (Sandbox Code Playgroud)

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

  • @Mark,如果您有不同类的列,则转换为矩阵_may_会产生一些副作用,因为R中的矩阵只能包含相同类的列. (2认同)

sbh*_*bha 6

以下是一个tidyverse可能会根据数据起作用的选项,以及有关其使用的一些注意事项:

library(tidyverse)

starting_df %>% 
  rownames_to_column() %>% 
  gather(variable, value, -rowname) %>% 
  spread(rowname, value)
Run Code Online (Sandbox Code Playgroud)

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

smiths %>% 
    gather(variable, value, -subject) %>% 
    spread(subject, value)
Run Code Online (Sandbox Code Playgroud)

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

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