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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:25:15