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

R语言pivot操作:含多组字段的宽表转回长表方案咨询

解决方案

你当前的宽表字段统一为[字段类型].[年份]的命名规则,仅用pivot_longer即可完成转换,操作代码如下:

library(tidyverse)

mydata.long <- mydata.wide %>%
  pivot_longer(
    # 排除id列,其余所有列都参与长宽转换
    cols = -id,
    # 拆分字段名,第一部分作为新列名,第二部分作为year列的值
    names_to = c(".value", "year"),
    # 以英文点作为字段名拆分的分隔符
    names_sep = "\\."
  ) %>%
  mutate(
    # 年份转为数值型方便后续分析
    year = as.numeric(year),
    # 显式将2009年的move值设为NA,符合业务逻辑
    move = ifelse(year == 2009, NA_character_, move)
  )

逻辑说明

  • pivot_longer中的.value是特殊参数,会把拆分字段名得到的第一部分(municip、move)直接作为新生成的列名,不需要额外做列名匹配
  • 拆分后天然生成id、year、municip、move四个字段,仅需额外处理2009年的move值即可满足需求
  • 你也可以优化之前生成迁移变量的逻辑,不需要先转宽表再转回长表,直接在最开始的长表中用lag()函数按id分组后生成move值,可选方案代码如下:
# 长表直接生成move变量的优化方案
mydata <- mydata %>%
  arrange(id, year) %>%
  group_by(id) %>%
  mutate(
    last_municip = lag(municip, 1),
    move = case_when(
      is.na(last_municip) & is.na(municip) ~ NA_character_,
      is.na(last_municip) & !is.na(municip) ~ "1",
      !is.na(last_municip) & !is.na(municip) & last_municip != municip ~ "3",
      !is.na(last_municip) & is.na(municip) ~ "4",
      TRUE ~ "2"
    )
  ) %>%
  select(-last_municip) %>%
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:15:03