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

如何用Tidyverse的pivot_wider一步实现指定行保留的宽表转换?

问题描述

我反复遇到一个问题,此前通过多次调用pivot_wider后再用rbind合并的繁琐方法解决,这种方式不够优雅,请问是否有一步实现的方法?

我的数据如下:

a <- c("Jan 2024", "212", "21000")
b <- c("Feb 2024", 188, "22000")
c <- c("Mar 2024", "166", "19000")

df <- as.data.frame(rbind(a,b,c))
colnames(df) <- c("MthYr", "count", "MedianTAT")

我期望得到指定行保留的宽格式数据。我尝试过以下两种写法:

Summary <- pivot_wider(df, names_from = MthYr, values_from = c(count, MedianTAT))

和

Summary <- pivot_wider(df, names_from = c(MthYr,count), values_from = c(MedianTAT))

但都无法得到符合需求的结果,请问该如何实现?


解决方案

你需要的是将count和MedianTAT作为行、各月份作为列的宽格式数据,通过转长再转宽的链式操作就能一步实现,无需多次拆分合并:

1. 修正数据类型

原数据中count和MedianTAT是字符型,先转成数值类型保证后续操作正常:

df$count <- as.numeric(df$count)
df$MedianTAT <- as.numeric(df$MedianTAT)

2. 一步生成目标宽表

使用tidyr包的pivot_longer + pivot_wider链式调用:

library(tidyr)
Summary <- df %>%
  pivot_longer(cols = c(count, MedianTAT), names_to = "metric", values_to = "value") %>%
  pivot_wider(names_from = MthYr, values_from = value)

最终结果

运行后得到的Summary格式如下:

# A tibble: 2 × 4
  metric     `Jan 2024` `Feb 2024` `Mar 2024`
  <chr>           <dbl>      <dbl>      <dbl>
1 count             212        188        166
2 MedianTAT       21000      22000      19000

逻辑说明

  • pivot_longer将原本的两个指标列(count/MedianTAT)合并为metric(指标名)和value(对应数值)两列,把数据转为长格式。
  • 紧接着pivot_wider将MthYr的不同取值作为列名,value作为列值,直接生成目标宽表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:37:13