如何用pivot_wider转换多粒度重复数据生成新列?
解决方法
你可以通过分组生成计划序号 + pivot_wider()的组合来实现需求,具体步骤如下:
1. 加载必要的包
需要用到dplyr做数据分组和转换,tidyr的pivot_wider()实现宽表转换:
library(dplyr) library(tidyr)
2. 数据转换代码
直接基于你的示例数据执行转换:
# 示例数据(可直接复用你已有的sample对象) sample <- tibble( client = c('smith', 'smith', 'black', 'lucas'), address = c('100 Main', '100 Main', '123 Elm', '222 Hill'), type = c('medical', 'dental', 'vision', 'medical'), comp = c(.1, .15, .12, .12) ) # 执行格式转换 sample_final <- sample %>% # 按客户+地址分组,给每个客户的计划生成序号(1、2...) group_by(client, address) %>% mutate(plan_num = row_number()) %>% ungroup() %>% # 转宽格式,指定列名规则 pivot_wider( id_cols = c(client, address), # 保留作为行标识的列 names_from = plan_num, # 用计划序号作为列名后缀来源 values_from = c(type, comp), # 需要转成宽列的字段 names_glue = "{.value}_{.name}"# 定义新列名格式:字段名_序号 ) %>% # 将缺失值替换为你预期的'na' mutate(across(c(type_2, comp_2), ~replace_na(.x, 'na')))
3. 输出结果
运行后sample_final的结构与你预期完全一致:
# A tibble: 3 × 6 client address type_1 comp_1 type_2 comp_2 <chr> <chr> <chr> <dbl> <chr> <chr> 1 smith 100 Main medical 0.1 dental 0.15 2 black 123 Elm vision 0.12 na na 3 lucas 222 Hill medical 0.12 na na
关键步骤说明
group_by() + mutate(row_number()):给每个客户的多条计划记录分配唯一序号,确保转宽时不同计划不会混淆。pivot_wider()的names_glue参数:灵活控制生成的宽列名称,完美匹配type_1、comp_2这类格式要求。replace_na():把无多计划客户的缺失字段替换为字符型na,与预期输出统一。
内容的提问来源于stack exchange,提问作者mr_puddles
相关产品推荐
相关产品推荐

