Arrays r中的二维矩阵到三维堆叠阵列
我在R中有一个数据框Arrays r中的二维矩阵到三维堆叠阵列,arrays,r,matrix,Arrays,R,Matrix,我在R中有一个数据框数据,大小为120000行乘5列 每300行是在不同时间间隔测量的帧(即400帧) 行动 我尝试使用数组(data,c(300,5400)) 预期的 通过每300行拆分数据,并将这400个矩阵相互堆叠,将此数据帧制作成3d数组 实际值 沿着数据的第一列向下读取值,并将其放入数组的第一部分。这里有一种使用dim的方法另一个选项是: m1 <- matrix(1:(300*400*5), nrow=300*400, ncol=5) lst <- lapply(sp
数据,大小为120000行乘5列
每300行是在不同时间间隔测量的帧(即400帧)
行动
我尝试使用数组(data,c(300,5400))
预期的
通过每300行拆分数据
,并将这400个矩阵相互堆叠,将此数据帧制作成3d数组
实际值
沿着数据的第一列向下读取值,并将其放入数组的第一部分。这里有一种使用dim的方法另一个选项是:
m1 <- matrix(1:(300*400*5), nrow=300*400, ncol=5)
lst <- lapply(split(seq_len(nrow(m1)),(seq_len(nrow(m1))-1) %/%300 +1),
function(i) m1[i,])
arr1 <- array(0, dim=c(300,5,400))
for(i in 1:400){
arr1[,,i] <- lst[[i]]
}
m1[297:300,]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 297 120297 240297 360297 480297
#[2,] 298 120298 240298 360298 480298
#[3,] 299 120299 240299 360299 480299
#[4,] 300 120300 240300 360300 480300
tail(arr1[,,1],4)
# [,1] [,2] [,3] [,4] [,5]
#[297,] 297 120297 240297 360297 480297
#[298,] 298 120298 240298 360298 480298
#[299,] 299 120299 240299 360299 480299
#[300,] 300 120300 240300 360300 480300
m1您是否尝试通过创建一个可复制的小示例来解决问题?目前还没有,我的主要问题是让数组按行而不是按列读取变量。我认为这将是一个快速解决方案。通常,使用一个小的可复制示例有助于确定问题的根源。看看aperm
。我已经添加了一些解释(按照您的要求),并且为了好玩,在那里放了一些基准测试:-)稍微慢一点,但手工工作更少,这将是abind(lappy(split(seq_len(nrow(m1)),(seq_len(nrow(m1))-1%%/%300+1),函数(x)m1[x,]),以及=3)
(其中abind
来自“abind”包)+1.@Ananda Mahto感谢我想到了abind
,然后我有心情玩for
循环。另外,因为基于您的示例的aperm
没有得到预期的结果。我使用了错误的顺序,比如list(300,5400)
而不是list(5300400)
:-)请问aperm
的时间复杂度是多少?
Sliced <- aperm(`dim<-`(t(mat), list(5, 3, 4)), c(2, 1, 3))
Sliced
# , , 1
#
# [,1] [,2] [,3] [,4] [,5]
# [1,] 27 69 27 80 74
# [2,] 38 39 39 11 70
# [3,] 58 77 2 73 48
#
# , , 2
#
# [,1] [,2] [,3] [,4] [,5]
# [1,] 91 50 39 42 87
# [2,] 21 72 87 83 44
# [3,] 90 100 35 65 25
#
# , , 3
#
# [,1] [,2] [,3] [,4] [,5]
# [1,] 95 39 49 79 8
# [2,] 67 78 60 56 10
# [3,] 63 94 50 53 32
#
# , , 4
#
# [,1] [,2] [,3] [,4] [,5]
# [1,] 7 22 19 79 52
# [2,] 21 66 83 3 67
# [3,] 18 13 67 48 41
m1 <- matrix(1:(300*400*5), nrow=300*400, ncol=5)
am <- function() {
aperm(`dim<-`(t(m1), list(5, 300, 400)), c(2, 1, 3))
}
ak <- function() {
lst <- lapply(split(seq_len(nrow(m1)),(seq_len(nrow(m1))-1) %/%300 +1),
function(i) m1[i,])
arr1 <- array(0, dim=c(300,5,400))
for(i in 1:400){
arr1[,,i] <- lst[[i]]
}
arr1
}
library(microbenchmark)
microbenchmark(am(), ak(), times = 20)
# Unit: milliseconds
# expr min lq median uq max neval
# am() 19.09133 27.63269 31.18292 67.12434 146.2673 20
# ak() 496.11494 518.71223 550.02215 591.27266 699.9834 20
m1 <- matrix(1:(300*400*5), nrow=300*400, ncol=5)
lst <- lapply(split(seq_len(nrow(m1)),(seq_len(nrow(m1))-1) %/%300 +1),
function(i) m1[i,])
arr1 <- array(0, dim=c(300,5,400))
for(i in 1:400){
arr1[,,i] <- lst[[i]]
}
m1[297:300,]
# [,1] [,2] [,3] [,4] [,5]
#[1,] 297 120297 240297 360297 480297
#[2,] 298 120298 240298 360298 480298
#[3,] 299 120299 240299 360299 480299
#[4,] 300 120300 240300 360300 480300
tail(arr1[,,1],4)
# [,1] [,2] [,3] [,4] [,5]
#[297,] 297 120297 240297 360297 480297
#[298,] 298 120298 240298 360298 480298
#[299,] 299 120299 240299 360299 480299
#[300,] 300 120300 240300 360300 480300
library(abind)
arr2 <- abind(lapply(split(seq_len(nrow(m1)),
(seq_len(nrow(m1))-1) %/% 300 + 1), function(x) m1[x, ]), along = 3)