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

R语言使用pivot_longer重塑数据集并拆分重命名列问题求助

实现代码

你可以通过tidyr的pivot_longer+pivot_wider组合,配合正则拆分列名实现需求,完整可运行代码如下:

library(tidyverse)

# 原始数据集
df <- tibble(
  uid = c("x1","x2","x3"),
  v13y1 = c(1,3,5),
  v13y1i = c(0,1,0),
  v13y1ii = c(1,0,0),
  v13y1iii = c(0,1,1),
  v13y1iv = c(0,2,0),
  v13y1v = c(1,3,0),
  v13y2 = c(2,3,2),
  v13y2i = c(0,1,0),
  v13y2ii = c(1,0,0),
  v13y2iii = c(0,1,1),
  v13y2iv = c(0,2,0),
  v13y2v = c(1,3,0)
)

# 转换逻辑
df_new <- df %>% 
  # 除uid外所有列转长格式,按正则拆分列名
  pivot_longer(
    cols = -uid,
    names_pattern = "v13y(\\d)(.*)",
    names_to = c("y_group", "var_suffix")
  ) %>% 
  # 后缀映射为目标列名
  mutate(var_name = case_when(
    var_suffix == "" ~ "v13y",
    var_suffix == "i" ~ "n1",
    var_suffix == "ii" ~ "n2",
    var_suffix == "iii" ~ "n3",
    var_suffix == "iv" ~ "n4",
    var_suffix == "v" ~ "n5"
  )) %>% 
  # 转回宽格式得到目标结构
  pivot_wider(
    id_cols = c(uid, y_group),
    names_from = var_name,
    values_from = value
  ) %>% 
  # 移除不需要的分组列
  select(-y_group)

逻辑说明

  1. 先用pivot_longer将宽表转为长表,通过正则v13y(\\d)(.*)把列名拆分为两个部分:y_group是列名中v13y后的数字(1/2,用来区分y1/y2两组数据),var_suffix是数字后的后缀部分
  2. 把后缀映射为目标数据的列名:空后缀对应核心值列v13y,i到v的罗马数字分别对应n1到n5
  3. 再用pivot_wider把数据转回宽表,每个uid对应y1/y2两行,最终得到需求结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:06:10