如何一步将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
相关产品推荐
相关产品推荐

