R语言中如何将数据框多组成对列透视转换为Date、Data两列长表
成对平行列转统一长表的实现方案
数据结构说明
当前输入数据为位置严格绑定的平行列结构,所有列按「日期列+对应数值列」的顺序逐组排列:
- 以
Date开头的列均为日期值,与右侧相邻的数值列一一配对 - 以
FC开头的列均为对应日期下的数值,无跨组对应关系
原始数据框的定义如下:
df = structure(list(Date...1 = structure(c(1577836800, 1577923200, 1578009600, 1578268800, 1578355200, 1578441600), class = c("POSIXct", "POSIXt"), tzone = "UTC"), FCGDP2021.2020 = c(1.2, 1.2, 1.2, 1.2, 1.2, 1.2), Date...3 = structure(c(1546300800, 1546387200, 1546473600, 1546560000, 1546819200, 1546905600), class = c("POSIXct", "POSIXt"), tzone = "UTC"), FCGDP2020.2019 = c(1.5, 1.5, 1.5, 1.5, 1.5, 1.5), Date...5 = structure(c(1514764800, 1514851200, 1514937600, 1515024000, 1515110400, 1515369600), class = c("POSIXct", "POSIXt"), tzone = "UTC"), FCGDP2019.2018 = c(1.8, 1.8, 1.8, 1.8, 1.8, 1.8)), row.names = c(NA, 6L), class = "data.frame")
预期目标
将所有成组的日期、对应数值逐行纵向拼接,最终生成仅包含Date、Data两列的长表,组排列顺序与原始列顺序完全一致:
- 先拼接第一组2020年日期+1.2的数值
- 再拼接第二组2019年日期+1.5的数值
- 最后拼接第三组2018年日期+1.8的数值
最终共18行记录。
常见转换失效原因
直接使用melt或pivot_longer转换时,函数默认基于列名解析组归属,而当前列名没有可统一识别的组标识规则,会将所有日期列合并为一个来源、所有数值列合并为另一个来源,最终造成日期与数值的行对应关系完全错乱,无法得到正确结果。
可落地实现方案
方案1:tidyverse 流式处理(代码简洁)
基于列位置逐组提取配对,避免列名解析误差:
library(tidyverse) res <- map_dfr( .x = seq(1, ncol(df), by = 2), # 按步长2遍历每一组的起始列位置 .f = function(start_idx) { tibble( Date = df[[start_idx]], # 取组内第1列:日期 Data = df[[start_idx + 1]] # 取组内第2列:对应数值 ) } )
方案2:基础R 实现(无第三方包依赖)
通过循环逐组提取、纵向绑定:
# 初始化空结果框 res <- data.frame( Date = as.POSIXct(length = 0, tz = "UTC"), Data = numeric(0) ) # 逐组遍历列 for (start_col in seq(1, ncol(df), by = 2)) { # 提取当前组的配对数据 group_data <- data.frame( Date = df[[start_col]], Data = df[[start_col + 1]] ) # 拼接至结果 res <- rbind(res, group_data) } # 重置行名 rownames(res) <- NULL
两种方案的输出结果与预期格式完全匹配。
内容的提问来源于stack exchange,提问作者Rollo99
相关产品推荐
相关产品推荐

