You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简洁转置dplyr生成的tibble汇总结果?

我懂你这个困扰!用t()转置tibble确实容易把结构搞乱,毕竟它是为矩阵设计的,不是为带列类型的tibble准备的。这里有几个贴合tidyverse风格的解决方案,完美实现你想要的转置效果:

方法1:用tidyr的重塑组合(推荐,tidyverse标准流程)

借助tidyr包的pivot_longer()和pivot_wider(),可以轻松完成结构化转置,还能保留原数据的类型信息。

首先加载所需包:

library(dplyr)
library(tidyr)

先生成你的汇总表,再进行重塑:

# 第一步:生成原始汇总tibble
summary_tbl <- mtcars %>% 
  group_by(am) %>% 
  summarise(
    n = n(),
    Mean_disp = mean(disp),
    Mean_hp = mean(hp),
    Mean_qsec = mean(qsec),
    Mean_drat = mean(drat)
  )

# 第二步:转置成目标格式
transposed_tbl <- summary_tbl %>%
  # 先把除了am之外的列都转成长格式
  pivot_longer(cols = -am, names_to = "metric", values_to = "value") %>%
  # 再把am的不同值转成列
  pivot_wider(names_from = am, values_from = value) %>%
  # 把metric列移到最前面,更贴合你的期望格式
  relocate(metric)

执行后得到的输出是:

#> # A tibble: 5 x 3
#>   metric      `0`   `1`
#>   <chr>     <dbl> <dbl>
#> 1 n          19    13  
#> 2 Mean_disp 290.  144. 
#> 3 Mean_hp   160.  127. 
#> 4 Mean_qsec  18.2  17.4
#> 5 Mean_drat   3.29  4.05

为什么这个方法靠谱?

  • 完全保留tibble的结构和各列的数据类型(比如n的整数属性不会丢失)
  • 可以灵活调整metric的顺序,或者修改列名
  • 符合tidyverse的编程习惯,可读性强,后续扩展也方便
方法2:用janitor包一键转置

如果你想要更简洁的写法,可以试试janitor包的transpose_df()函数,它专门为tibble优化了转置逻辑:

library(janitor)

summary_tbl %>%
  janitor::transpose_df(rownames_to = "metric")

这个函数会自动处理行名和列的映射,输出结果和你期望的格式几乎一致。

小提醒

你示例里的<dbl>、<int>是tibble的打印格式标注,不是数据本身的一部分。如果确实需要在输出里展示类型,可以手动添加一列(比如用map_chr(summary_tbl, typeof)获取类型),但通常数据存储不需要保留这些信息。

内容的提问来源于stack exchange,提问作者Eric Fail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:21:36