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

如何用pivot_longer将宽表转为多值长表并提取年份

宽表转长表的正确实现方法

原始宽表数据

states <- tibble(
  state = c("Idaho","Illinois","Indiana"),
  statefip = 16:18,
  da2012 = 0,
  da2013 = 0,
  da2014 = c(1, 0, 0),
  daes2012 = c(-4, 0, 0),
  daes2013 = c(-3, 0, 0),
  daes2014 = c(-2, 0, 0),
  rural_pct = c(0.29421874, 0.11512130, 0.27556394)
)

需求说明

需要将上述宽表转换为包含state、statefip、year、da、daes、rural_pct列的长表,每行对应一个州的单一年度数据。

原代码问题分析

你之前的pivot_longer写法有误:直接指定names_to = "year"无法区分da和daes前缀,也没法从列名里提取年份;同时values_to传入向量的方式需要配合正则匹配规则,否则不能正确把值映射到da和daes列。

正确实现代码

用pivot_longer结合正则表达式匹配列名里的前缀和年份,就能完成转换:

library(tidyverse)

states_long <- states %>%
  pivot_longer(
    cols = starts_with("da"),  # 选中所有以da开头的列
    names_to = c(".value", "year"),  # .value用匹配到的前缀作为新列名,year提取年份
    names_pattern = "(da.*?)(\\d{4})"  # 正则分组:第一组匹配da/daes前缀,第二组匹配4位年份
  )

代码解释

  • names_pattern = "(da.*?)(\\d{4})":正则分两组,第一组(da.*?)非贪婪匹配da或daes前缀,第二组(\\d{4})匹配4位数字的年份;
  • names_to = c(".value", "year"):第一组匹配结果对应da和daes列的值,第二组结果作为year列的内容;
  • 执行后会自动保留state、statefip、rural_pct这些非透视列,最终得到符合需求的长表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:20:28