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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:01:00