如何在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 )
关键步骤解释
pivot_longer转长格式:names_pattern用正则匹配列名结构:识别OriginalDate/OriginalFICO、RefreshFICODate/RefreshFICO、RefreshFICODate2/RefreshFICO2这类配对列,自动将同组的日期和FICO值分到同一行。.value参数指定保留列的核心类型(Date或FICO),group用来区分不同的列组(无后缀、1、2...)。
统一日期格式:
原始数据中OriginalDate是字符串,RefreshFICODateX是POSIXct类型,通过as.character()把POSIXct转为YYYY-MM-DD格式的字符串,确保所有日期格式一致,才能作为列名。去重与转宽:
原始数据中OriginalDate每行重复,转长后会生成大量冗余行,用distinct()去重后,再用pivot_wider将日期转成列名,完成最终格式转换。
转换后示例结果
| ProductAccountNumber | 2009-04-14 | 2012-09-30 | 2013-07-15 | 2015-04-06 |
|---|---|---|---|---|
| 17397841 | 810 | 827 | 815 | 767 |
内容的提问来源于stack exchange,提问作者Jason Richardson
相关产品推荐
相关产品推荐

