如何在tidyverse中转置数据帧?

Ira*_*kli 5 transpose r dataframe tidyr tidyverse

使用基本R,我可以转置一个数据帧,比如说mtcars,它包含同一个类的所有列:

as.data.frame(t(mtcars))
Run Code Online (Sandbox Code Playgroud)

或者用管道:

library(magrittr)
mtcars %>% t %>% as.data.frame
Run Code Online (Sandbox Code Playgroud)

如何在tidyr或tidyverse包中完成相同的操作?

我在下面的尝试给出:

错误:行的重复标识符

library(tidyverse)
mtcars %>% gather(var, value, everything()) %>% spread(var, value)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 24

试试吧 add_rownames

add_rownames(mtcars) %>% 
         gather(var, value, -rowname) %>% 
         spread(rowname, value) 
Run Code Online (Sandbox Code Playgroud)

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

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

  • Puuh,与 ``t()``` 相比,这是相当密集的代码。似乎是下一个 dplyr 版本的待办事项列表中的事情。 (9认同)

Joe*_*Joe 11

现在有一个专门构建的函数可以执行此操作,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
Run Code Online (Sandbox Code Playgroud)

该函数还允许您通过旋转将行名转换为真实的 df 数据。非常感谢包的创建者。