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

如何用pivot_longer()替代gather()实现指定数据重塑效果?

用pivot_longer()替代gather()实现数据重塑

可复现数据与原gather()实现

以下是可复现的数据集和你原本使用gather()的代码(注:原代码存在参数错误,已修正为能得到期望输出的版本):

m="
id count2020 count2021 ratio2020 ratio2021
A  1         2         .1        .2
A  3         4         .3        .4
B  5         6         .5        .6
B  7         8         .7        .8
"
d1  <- read.table(text = m, h=T)

# 修正后的gather()实现
d1 %>% 
  gather(key = "year", value = "ratio", ratio2020:ratio2021) %>%
  gather(key = "year_count", value = "count", count2020:count2021) %>%
  mutate(year = gsub("ratio", "", year)) %>%
  select(id, count, year, ratio) %>%
  arrange(id, year)

期望输出

id count year ratio
1  A     1 2020   0.1
2  A     2 2021   0.2
3  A     3 2020   0.3
4  A     4 2021   0.4
5  B     5 2020   0.5
6  B     6 2021   0.6
7  B     7 2020   0.7
8  B     8 2021   0.8

用pivot_longer()实现相同效果

pivot_longer()比gather()更灵活,只需一次调用就能完成两组列的重塑,无需多次拼接和清洗:

library(tidyr)
library(dplyr)

d1 %>%
  pivot_longer(
    cols = -id,
    names_to = c(".value", "year"),
    names_pattern = "(count|ratio)(\\d{4})"
  ) %>%
  arrange(id, year)

关键参数说明

  • cols = -id:保留id列,对其余所有列执行重塑操作
  • names_to = c(".value", "year"):将列名拆分为两部分,.value表示列名中对应的指标类型(count/ratio)会作为新的列名,year则存储提取出的年份值
  • names_pattern = "(count|ratio)(\\d{4})":通过正则表达式匹配列名,第一组捕获指标类型,第二组捕获四位数字的年份

运行上述代码后,得到的结果和期望输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:20:35