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
相关产品推荐
相关产品推荐

