【问题标题】:Simple way to rotate dplyr's tibble summary旋转 dplyr 的 tibble 摘要的简单方法
【发布时间】:2018-02-13 06:43:31
【问题描述】:

我正在寻找一种简单的方法来旋转tibble 摘要。

假设我正在做这样的事情,

# install.packages(c("dplyr"), dependencies = TRUE)
library(dplyr) 

mtcars %>% 
    group_by(am)  %>%
    summarise(
        n = n(),
        Mean_disp = mean(disp),
        Mean_hp = mean(hp),
        Mean_qsec = mean(qsec),
        Mean_drat = mean(drat)
             )
#>     # A tibble: 2 x 6
#>      am     n Mean_disp  Mean_hp Mean_qsec Mean_drat
#>   <dbl> <int>     <dbl>    <dbl>     <dbl>     <dbl>
#> 1     0    19  290.3789 160.2632  18.18316  3.286316
#> 2     1    13  143.5308 126.8462  17.36000  4.050000

但是,我想要的是或多或少像这样的输出,

#> # A tibble: 5 x 2
#>    am <dbl>             0           1
#>   n <int>              19          13
#>   Mean_disp <dbl>     290.3789    143.5308
#>   Mean_hp <dbl>       160.2631    126.8462
#>   Mean_qsec <dbl>      18.183158   17.36000
#>   Mean_drat <dbl>       3.286316    4.050000

我意识到我可以使用t(),但这会将小标题转换为列表并弄乱格式。

【问题讨论】:

  • stackoverflow.com/questions/48282782/… 重复。尝试用 as.data.frame() 包装 t 函数调用
  • @icj 我认为你的链接是错误的。
  • @icj 一个重复的问题?
  • @user,是的,我很抱歉。我会尽快挖掘相应的链接。
  • 试试skimr包

标签: dplyr r dplyr tidyverse


【解决方案1】:

也许聚集然后再次传播

library(dplyr) 
library(tidyr)

mtcars %>% 
  group_by(am)  %>%
  summarise(
    n = n(),
    Mean_disp = mean(disp),
    Mean_hp = mean(hp),
    Mean_qsec = mean(qsec),
    Mean_drat = mean(drat)) %>%
  gather(key = key, value = value, -am) %>% 
  spread(key = am, value = value)


# # A tibble: 5 x 3
#         key        `0`      `1`
# *     <chr>      <dbl>    <dbl>
# 1 Mean_disp 290.378947 143.5308
# 2 Mean_drat   3.286316   4.0500
# 3   Mean_hp 160.263158 126.8462
# 4 Mean_qsec  18.183158  17.3600
# 5         n  19.000000  13.0000

另一个选项,gathergroup_by 之前,然后获取所有选定列的平均值,然后再次 spread(但不确定如何添加 @ 987654322@):

mtcars %>% 
  select(am, disp, hp, qsec, drat) %>% 
  gather(key = key, value = value, -am) %>% 
  group_by(am, key)  %>%
  summarise(myMean = mean(value)) %>%
  spread(key = am, value = myMean)

# # A tibble: 4 x 3
#     key        `0`      `1`
# * <chr>      <dbl>    <dbl>
# 1  disp 290.378947 143.5308
# 2  drat   3.286316   4.0500
# 3    hp 160.263158 126.8462
# 4  qsec  18.183158  17.3600

【讨论】:

  • 非常感谢。它完成了这项工作,但它有点简单。我说的是关于我的标题简单地 ...正如您还指出` gather 然后spread 再次。我会暂缓识别你的答案,看看是否有人想出简单的方法。
  • @EricFail 添加了另一个选项,再次不确定它是否更简单。
  • 有趣。谢谢!在我看来,这整个tidyverse 逻辑我仍然没有看到。无论如何,我非常感谢您的回答!
【解决方案2】:
  new_tibble <- as.data.frame(t(mt_cars_df)) %>% 
  as_tibble()

  new_tibble$name <- names(mt_cars_df) %>%
    select(name, V1, V2)

根据this,在小标题中不推荐使用row.names,因此将它们作为键列添加是处理这种情况的合乎逻辑的方式。这留下了一个需要重新排序列的小标题。

【讨论】:

  • 这不是简单地将t() 包裹在as.data.frame() 中吗?你注意到我在我的问题中的最后评论了吗?如果我想在任何东西中包含转置,那就是as_tibble()
猜你喜欢
  • 2022-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2011-06-11
相关资源
最近更新 更多