如何在tidyverse中转置数据框?

33

使用基本的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
如果你想转置它,应该使用矩阵而不是数据框。使用t有什么问题? - Roland
4
尝试使用add_rownames(mtcars) %>% gather(var, value, -rowname) %>% spread(rowname, value)的语句。该语句的功能是将mtcars数据集添加行名,然后将数据从宽格式转换为长格式,最后再将数据从长格式转换回宽格式。 - akrun
2
为什么你想要这样做?在不丢失信息的情况下,你无法有意义地转置一个包含多种变量类别的数据框。 - Thomas
2
一个数据框,例如mtcars,可能具有相同类别的所有列。 - Irakli
2个回答

79

尝试使用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) 

谢谢@akrun。看起来add_rownames已经过时了,但这个方法可行:mtcars%>% rownames_to_column%>% gather(var,value,-rowname)%>% spread(rowname,value) - Irakli
转换后的数据行默认按顺序排列(在 mtcars 示例中是按字母顺序排列)。 如果您想根据初始列顺序(即 names(mtcars))对行进行排序,则需要执行额外的步骤:mtcars.t[order(match(mtcars.t$var,names(mtcars))),],其中 mtcars.t 是转换后的数据。 - fabern
刚提交后我才意识到gather()现在已经改成了pivot_longer() :/ - keithpjolley
7
t() 相比,这看起来是相当代码密集的。似乎在下一个 dplyr 版本的待办事项清单上。 - MsGISRocker

11
现在有一个专门的函数可以做到这一点,sjmisc 中的 rotate_df()
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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接