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

如何在pivot_wider中配对列实现数据宽表转换

批量转换日期-FICO列对为目标宽格式

要批量处理10组「日期列-FICO值列」,不用逐个操作,通过先转长格式再转宽格式的组合操作就能实现,核心用tidyr的pivot_longer和pivot_wider函数。

完整代码

library(tidyverse)

# 假设你的原始数据框名为df
df_final <- df %>%
  # 将多组日期-FICO列对转成长格式,自动匹配列名分组
  pivot_longer(
    cols = -ProductAccountNumber,
    names_to = c(".value", "group"),
    names_pattern = "(Original|RefreshFICO)(Date|)(\\d*)"
  ) %>%
  # 统一日期格式:将POSIXct类型转为YYYY-MM-DD字符串,合并OriginalDate到Date列
  mutate(Date = if_else(is.na(Date), OriginalDate, as.character(Date))) %>%
  # 保留核心列并去重(OriginalDate在原始数据中每行重复,转长后会产生冗余)
  select(ProductAccountNumber, Date, FICO) %>%
  distinct() %>%
  # 转成目标宽格式:日期作为列名,FICO值作为单元格内容
  pivot_wider(
    id_cols = ProductAccountNumber,
    names_from = Date,
    values_from = FICO
  )

关键步骤解释

  1. pivot_longer转长格式:

    • names_pattern用正则匹配列名结构:识别OriginalDate/OriginalFICO、RefreshFICODate/RefreshFICO、RefreshFICODate2/RefreshFICO2这类配对列,自动将同组的日期和FICO值分到同一行。
    • .value参数指定保留列的核心类型(Date或FICO),group用来区分不同的列组(无后缀、1、2...)。
  2. 统一日期格式:
    原始数据中OriginalDate是字符串,RefreshFICODateX是POSIXct类型,通过as.character()把POSIXct转为YYYY-MM-DD格式的字符串,确保所有日期格式一致,才能作为列名。

  3. 去重与转宽:
    原始数据中OriginalDate每行重复,转长后会生成大量冗余行,用distinct()去重后,再用pivot_wider将日期转成列名,完成最终格式转换。

转换后示例结果

ProductAccountNumber2009-04-142012-09-302013-07-152015-04-06
17397841810827815767

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:23:07