You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从矩阵到三维数组:多ID时序特征数据转换技术问询

原代码的可行性

你的代码逻辑上是可行的,但得满足几个前提条件:

  • 必须先加载abind包(因为用到了abind()函数),也就是先运行library(abind)
  • ids得是去重后的唯一ID向量(比如ids <- unique(TABLE1$id)),而且每个ID在TABLE1里恰好有4条记录——不然拼接时会因为维度不匹配直接报错;
  • 循环里省略的...部分不能破坏数组拼接的逻辑。

不过这种循环拼接的方式有个明显短板:每次循环都要重新创建新数组并复制原有数据,当ID数量很多时,运行效率会偏低,内存占用也会更高。

更高效的替代方案

在R里处理这类分组转三维数组的需求,更推荐用向量化的分组操作替代循环,下面提供几种实用且高效的方法:

方法1:Base R原生实现(无需额外安装包)

这是最轻量化的方案,完全用R原生函数搞定:

# 1. 按ID拆分特征列(去掉id列)
split_features <- split(TABLE1[, -"id"], TABLE1$id)

# 2. 转成数组并调整维度顺序
trainData <- aperm(simplify2array(split_features), c(3, 2, 1))
  • split()会把每个ID对应的特征数据拆成列表的一个元素;
  • simplify2array()会把列表转成三维数组,但默认维度是[特征数, 时间步, ID数]
  • aperm()用来调整维度顺序,最终得到你需要的[ID数量, 4, 2]结构。

方法2:tidyverse工具链(适合熟悉dplyr的用户)

如果你习惯用tidyverse的语法,这样写更贴合你的数据分析习惯:

library(dplyr)
library(purrr)

trainData <- TABLE1 %>%
  group_by(id) %>%
  nest() %>%  # 按ID嵌套特征数据
  mutate(arr = map(data, ~as.matrix(.x))) %>%  # 把每个嵌套的数据集转成矩阵
  pull(arr) %>%  # 提取矩阵列表
  simplify2array() %>%
  aperm(c(3, 2, 1))  # 调整到目标维度顺序

方法3:data.table(大数据场景下速度最优)

如果你的数据集规模很大,data.table的处理速度会比前两种方法更快:

library(data.table)
setDT(TABLE1)

trainData <- aperm(
  simplify2array(TABLE1[, .(arr = list(as.matrix(.SD))), by = id]$arr),
  c(3, 2, 1)
)
额外建议:先验证数据完整性

转换前建议先检查每个ID的记录数是否都是4,避免因为数据异常导致转换失败:

# 查看每个ID对应的记录数量
table(TABLE1$id)

如果有ID的记录数不是4,得先补全或过滤数据,再进行数组转换。

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

火山引擎 最新活动