28

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

as.data.frame(t(mtcars))

或使用管道:

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

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

我在下面的尝试给出了:

错误:行标识符重复

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

2 回答 2

66

尝试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) 
于 2016-10-28T14:57:05.003 回答
1

现在有一个专门构建的函数来执行此操作,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 数据。非常感谢包的创建者。

于 2022-01-12T13:38:50.703 回答