Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays r中的二维矩阵到三维堆叠阵列_Arrays_R_Matrix - Fatal编程技术网

Arrays 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

我在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(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)