如何用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循环效率高得多:
- 先按
Name分组,统一处理每个个体的记录 - 过滤掉不符合条件的分组,减少后续计算量
- 按
Date排序保证Result的时间顺序正确 - 通过转宽格式或直接提取位置值,将每个个体的多条记录合并为一行
内容的提问来源于stack exchange,提问作者monamona
相关产品推荐
相关产品推荐

