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

R语言使用pivot_longer合并数据集实现宽表转长表的高效方法

解决方案

你可以通过pivot_longer的列名正则拆分功能一行完成转换,操作如下:

1 修正原始数据构造

你提供的原始数据构造代码中,area、area2的元素未加引号会被R识别为未定义对象,同时需要把这两个字段加入原始数据框:

issue_1_t1 <- c(10, 20, 30, 40)
issue_2_t1 <- c(10, 20, 30, 10)
issue_1_t2 <- c(10, 20, 30, 40)
issue_2_t2 <- c(10, 20, 30, 10)
issue_1_t3 <- c(10, 20, 30, 40)
issue_2_t3 <- c(10, 20, 30, 10)
area <- c("area1", "area2", "area3", "area4")
area2 <- c("area10", "area20", "area30", "area40")
df <- data.frame(area, area2, issue_1_t1, issue_2_t1, issue_1_t2, issue_2_t2, issue_1_t3, issue_2_t3)

2 核心转换代码

加载tidyr包后运行以下一行代码即可得到目标结构:

library(tidyr)
result <- pivot_longer(df, cols = -c(area, area2), names_to = c(".value", "time"), names_pattern = "(issue_\\d+)_t(\\d)") %>% select(-time)

3 逻辑说明

  • cols = -c(area, area2):指定保留area、area2为固定维度列,其余所有issue列参与长宽转换
  • names_pattern = "(issue_\\d+)_t(\\d)":通过正则表达式将issue_1_t1这类列名拆分为issue_1和1两个分组
  • names_to = c(".value", "time"):将拆分出的第一个分组作为新的列名,第二个分组存入临时的time列标识时间周期
  • 最后删除不需要的time列,即可得到你需要的输出

注:你手写的目标输出中每个时间组第四行的issue2值为40,和你原始数据中issue_2_t*第四行值为10的设定不一致,属于手误,代码会按原始数据的真实值输出。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:45:09