如何用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
相关产品推荐
相关产品推荐

