简体   繁体   English

如何在 tidyverse 中转置数据帧?

[英]How to transpose a dataframe in tidyverse?

Using basic R, I can transpose a dataframe, say mtcars , which has all columns of the same class:使用基本的 R,我可以转置一个数据帧,比如mtcars ,它具有同一类的所有列:

as.data.frame(t(mtcars))

Or with pipes:或使用管道:

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

How to accomplish the same within tidyr or tidyverse packages?如何在 tidyr 或 tidyverse 包中完成相同的任务?

My attempt below gives:我在下面的尝试给出了:

Error: Duplicate identifiers for rows错误:行标识符重复

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

Try with add_rownames尝试使用add_rownames

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

In the newer version, rownames_to_column replaces add_rownames在较新的版本, rownames_to_column取代add_rownames

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

In the even newer version, pivot_wider replaces spread :在更新的版本中, pivot_wider替换了spread

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

There's now a purpose-built function to do this, rotate_df() from sjmisc .现在有一个专门构建的函数,来自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

The function also allows you to convert rownames to real df data with the rotate.该函数还允许您通过旋转将行名转换为真实的 df 数据。 Many thanks to the package creators.非常感谢包的创建者。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM