如何在 tidyverse 中转置数据框?

How to transpose a dataframe in tidyverse?

使用基本的 R,我可以转置一个数据帧,比如 mtcars,它具有相同的所有列 class:

as.data.frame(t(mtcars))

或者用管道:

library(magrittr)
mtcars %>% t %>% as.data.frame

如何在 tidyr 或 tidyverse 包中完成相同的任务?

我下面的尝试给出了:

Error: Duplicate identifiers for rows

library(tidyverse)
mtcars %>% gather(var, value, everything()) %>% spread(var, value)

试试 add_rownames

add_rownames(mtcars) %>% 
         gather(var, value, -rowname) %>% 
         spread(rowname, value) 

在较新的版本中,rownames_to_column 替换了 add_rownames

mtcars %>%
   rownames_to_column %>% 
   gather(var, value, -rowname) %>% 
   spread(rowname, value) 

在更新的版本中,pivot_wider 替换了 spread:

mtcars %>%
   tibble::rownames_to_column() %>%  
   pivot_longer(-rowname) %>% 
   pivot_wider(names_from=rowname, values_from=value) 

现在有一个专门用于执行此操作的函数,rotate_df() 来自 sjmisc

library(sjmisc)
mtcars %>% rotate_df()

#     Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive Hornet Sportabout Valiant Duster 360
#mpg      21.00        21.000      22.80         21.400             18.70   18.10      14.30
#cyl       6.00         6.000       4.00          6.000              8.00    6.00       8.00
#disp    160.00       160.000     108.00        258.000            360.00  225.00     360.00
#hp      110.00       110.000      93.00        110.000            175.00  105.00     245.00
#drat      3.90         3.900       3.85          3.080              3.15    2.76       3.21

#etc

该函数还允许您使用旋转将行名转换为真正的 df 数据。非常感谢软件包创建者。