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)
逻辑说明
- 先用
pivot_longer将宽表转为长表,通过正则v13y(\\d)(.*)把列名拆分为两个部分:y_group是列名中v13y后的数字(1/2,用来区分y1/y2两组数据),var_suffix是数字后的后缀部分 - 把后缀映射为目标数据的列名:空后缀对应核心值列
v13y,i到v的罗马数字分别对应n1到n5 - 再用
pivot_wider把数据转回宽表,每个uid对应y1/y2两行,最终得到需求结构。
内容的提问来源于stack exchange,提问作者jmutua
相关产品推荐
相关产品推荐

