【问题标题】:How to transpose a dataframe in tidyverse?如何在 tidyverse 中转置数据帧?
【发布时间】:2017-03-11 10:00:36
【问题描述】:

使用基本的 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)

【问题讨论】:

  • 如果你想转置它应该是一个矩阵而不是一个data.frame。使用t 有什么问题?
  • 试试add_rownames(mtcars) %>% gather(var, value, -rowname) %>% spread(rowname, value)
  • 为什么要这样做?您无法在不丢失信息的情况下有意义地转置包含许多变量类的 data.frame。
  • 一个数据框,例如 mtcars,可能有相同类的所有列。

标签: r dataframe transpose tidyr tidyverse


【解决方案1】:

试试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)
  • 默认情况下,转换后的数据中的行是有序的(按字母顺序排列 mtcars 的情况)。如果您想根据初始列顺序(即names(mtcars))对行进行排序,则需要一个额外的步骤:mtcars.t[order(match(mtcars.t$var,names(mtcars))),],其中 mtcars.t 是转换后的数据。
  • 在我点击提交后我意识到gather() 现在是pivot_longer() :/
  • Puuh,与t() 相比,这代码相当密集。似乎在下一个 dplyr 版本的待办事项列表中。
猜你喜欢
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 2021-05-21
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多