如何简洁转置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
相关产品推荐
相关产品推荐

