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

如何一步将tibble转换为指定排列顺序的三维数组?

问题描述

现有如下tibble:

df <- dplyr::tibble(id = c(1, 1, 1, 2, 2, 2),
                    value = c(0.2, 0.3, 0.4, 0.5, 0.6, 0.7),
                    value2 = c(1.2, 1.3, 1.4, 1.5, 1.6, 1.7))

需要将其转换为维度为c(batch_size=2, lookbacks=3, n_features=2)的数组,手动赋值能得到预期输出:

batch_size <- 2
lookbacks <- 3
n_features <- 2

x <- as.matrix(df %>% select(-id))
samples <- array(0, dim = c(batch_size, lookbacks, n_features))
samples[1,,] <- x[1:3, ]
samples[2,,] <- x[4:6, ]

预期输出结构:

[,1] [,2] [,3]
[1,]  0.2  0.3  0.4
[2,]  0.5  0.6  0.7

, , 2

     [,1] [,2] [,3]
[1,]  1.2  1.3  1.4
[2,]  1.5  1.6  1.7

但直接用samples <- array(x, dim = c(batch_size, lookbacks, n_features))转换时数据顺序错误,想要一步到位实现预期数组结构。


解决方案

方法1:用aperm调整维度顺序

先按临时维度生成数组,再转置调整维度排列顺序,直接匹配预期结构:

x <- as.matrix(df %>% select(-id))
samples <- aperm(array(x, dim = c(lookbacks, batch_size, n_features)), c(2, 1, 3))

原理:先把数组初始维度设为(lookbacks, batch_size, n_features),再通过aperm把维度顺序调整为(batch_size, lookbacks, n_features),数据排列就会和手动赋值一致。

方法2:按id分组拼接

结合dplyr分组和abind包的拼接功能,直接生成目标数组:

library(abind)
samples <- df %>%
  select(-id) %>%
  group_split(id) %>%
  lapply(as.matrix) %>%
  abind(along = 3) %>%
  aperm(c(3, 2, 1))

原理:按id拆分数据,每组转成矩阵后沿第3维度合并,最后转置调整维度顺序得到目标结构。

方法3:转置原矩阵后重塑

通过转置原矩阵改变数据排列逻辑,再直接设置维度并调整:

x <- as.matrix(df %>% select(-id))
samples <- array(t(x), dim = c(n_features, lookbacks, batch_size)) %>% aperm(c(3, 2, 1))

原理:先转置x让数据按特征-观测的顺序排列,设置临时维度后再转置为目标维度顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:26:22