R语言中如何使用dplyr实现双透视以重构数据集?
用dplyr重构数据集的解决方案
你的原始数据集第一行实际是变量标识(GROUP、CLASS分类),后续行是实际数据。我们可以结合dplyr和tidyr(同属tidyverse生态,与dplyr兼容)完成格式转换,步骤如下:
1. 加载依赖包
library(dplyr) library(tidyr) library(stringr) # 用于字符串处理
2. 修正原始数据集结构
原始数据的第一行是列的分类信息,需要将其设为列名,并提取实际数据行:
# 把第一行内容设为新列名 colnames(my_data) <- my_data[1, ] # 提取实际数据行,重命名x列为GROUP,同时把数值列转为数值类型 my_data_clean <- my_data[-1, ] %>% rename(GROUP = `GROUP`) %>% mutate(across(-GROUP, as.numeric))
3. 宽格式转长格式(核心步骤)
通过pivot_longer拆分日期和CLASS信息,将宽表转为目标长表:
my_data_final <- my_data_clean %>% # 把除GROUP外的所有列转成长格式 pivot_longer( cols = -GROUP, names_to = "col_name", values_to = "Value" ) %>% # 从列名中提取日期和CLASS分类 mutate( # 提取日期数字,生成统一的Date标签(比如date_1 → Date 1) Date = paste("Date", str_extract(col_name, "\\d")), # 判断CLASS:列名以_1结尾的是CLASS 2,否则是CLASS 1 CLASS = ifelse(str_detect(col_name, "_1$"), "CLASS 2", "CLASS 1") ) %>% # 保留需要的列并调整顺序 select(GROUP, Date, CLASS, Value)
最终结果
执行后得到的my_data_final结构如下:
# A tibble: 12 × 4 GROUP Date CLASS Value <chr> <chr> <chr> <dbl> 1 A Date 1 CLASS 1 20 2 A Date 1 CLASS 2 37 3 A Date 2 CLASS 1 15 4 A Date 2 CLASS 2 84 5 B Date 1 CLASS 1 60 6 B Date 1 CLASS 2 22 7 B Date 2 CLASS 1 100 8 B Date 2 CLASS 2 18 9 C Date 1 CLASS 1 82 10 C Date 1 CLASS 2 8 11 C Date 2 CLASS 1 76 12 C Date 2 CLASS 2 88
补充说明
- 如果你的实际日期不是"Date 1"这种格式,而是具体日期(比如"2024-01-01"),只需要修改
Date列的生成逻辑,把对应日期替换进去即可。 stringr包的函数用于处理列名的字符串拆分,是tidyverse的一部分,和dplyr配合使用很方便。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

