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

如何用R语言转换数据集:将多Result条目汇总为单行用于回归预测

R语言高效转换数据集(用于回归建模)

原始数据集

用户提供的原始数据格式如下:

Name, Result, Date
Peter Parker, 150, 2018-03-03
Peter Parker, 155, 2018-03-04
Peter Parker, 156, 2018-03-05
Peter Parker, 154, 2018-03-06
Peter Parker, 158, 2018-03-07
Benny Thompson, 130, 2018-03-03
Benny Thompson, 132, 2018-03-04
Benny Thompson, 138, 2018-03-05
Benny Thompson, 140, 2018-03-07
Benny Thompson, 139, 2018-03-09
Mylo Thony, 177, 2018-03-11

需求说明

  • 仅保留记录数≥5条的个体
  • 将每个个体的Result按Date排序后,转换为一行5个值的格式(前4个作为特征,第5个作为回归目标)
  • 避免使用for循环,采用R语言原生的向量/分组处理风格

实现方案

方法1:Tidyverse(dplyr + tidyr)

适合习惯整洁代码风格的场景,代码可读性强:

# 加载tidyverse工具包
library(tidyverse)

# 读入数据(如果是本地文件,替换text参数为文件路径)
df <- read.csv(text = "Name, Result, Date
Peter Parker, 150, 2018-03-03
Peter Parker, 155, 2018-03-04
Peter Parker, 156, 2018-03-05
Peter Parker, 154, 2018-03-06
Peter Parker, 158, 2018-03-07
Benny Thompson, 130, 2018-03-03
Benny Thompson, 132, 2018-03-04
Benny Thompson, 138, 2018-03-05
Benny Thompson, 140, 2018-03-07
Benny Thompson, 139, 2018-03-09
Mylo Thony, 177, 2018-03-11", header = TRUE)

# 数据转换流程
final_data <- df %>%
  # 按姓名分组
  group_by(Name) %>%
  # 过滤掉记录数不足5的个体
  filter(n() >= 5) %>%
  # 按日期排序,确保Result按时间顺序排列
  arrange(Date, .by_group = TRUE) %>%
  # 给每个分组内的记录编号
  mutate(seq_id = 1:n()) %>%
  # 从长格式转宽格式,每个编号对应一列Result
  pivot_wider(names_from = seq_id, values_from = Result) %>%
  # 只保留前5列的Result值
  select(`1`, `2`, `3`, `4`, `5`) %>%
  # 取消分组,转换为矩阵(可选,根据建模需求调整)
  ungroup() %>%
  as.matrix()

# 查看结果
final_data

输出结果:

1   2   3   4   5
[1,] 150 155 156 154 158
[2,] 130 132 138 140 139

方法2:data.table(高效处理大数据)

如果数据集规模较大(百万级以上),data.table的处理速度远优于tidyverse,适合高性能场景:

# 加载data.table工具包
library(data.table)

# 读入数据并转换为data.table格式
dt <- fread(text = "Name, Result, Date
Peter Parker, 150, 2018-03-03
Peter Parker, 155, 2018-03-04
Peter Parker, 156, 2018-03-05
Peter Parker, 154, 2018-03-06
Peter Parker, 158, 2018-03-07
Benny Thompson, 130, 2018-03-03
Benny Thompson, 132, 2018-03-04
Benny Thompson, 138, 2018-03-05
Benny Thompson, 140, 2018-03-07
Benny Thompson, 139, 2018-03-09
Mylo Thony, 177, 2018-03-11")

# 数据转换流程
final_dt <- dt[, .SD[order(Date)], by = Name][  # 按姓名分组并按日期排序
  .SD[.N >= 5], by = Name][  # 过滤记录数≥5的个体
  .(V1 = Result[1], V2 = Result[2], V3 = Result[3], V4 = Result[4], V5 = Result[5]), 
  by = Name][, -"Name"] %>%  # 提取前5个Result值,去掉姓名列
  as.matrix()

# 查看结果
final_dt

核心思路说明

R语言的优势在于向量式操作和分组处理,底层函数已经做了性能优化,比手动写for循环效率高得多:

  1. 先按Name分组,统一处理每个个体的记录
  2. 过滤掉不符合条件的分组,减少后续计算量
  3. 按Date排序保证Result的时间顺序正确
  4. 通过转宽格式或直接提取位置值,将每个个体的多条记录合并为一行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:40:19