在R中从数据框创建三维数组

3

我有一个2D数据框,其中有3600行和800列的雷达数据,我需要将其转换为一个3D数组,其中有10行、360列和800个级别。我需要将3600行分成10组,每组包含360行,并将800列转换为新数组的级别。因此,不是-

> dim(REF)
[1] 3600  800

我需要将值输入到表单中-
> dim(ref.array)
[1]  10 360 800

我知道这是一个相当基本的请求,但因为两年前上完课后就没有太多机会使用R,所以我记不清了。非常感谢您提供的任何帮助。

下面编辑来回答问题。

如果我们采用@BondedDust给出的例子,我们将得到以下结果-

d <- as.data.frame( matrix( 1:(3*4*5), 12, 5))
array( unlist(d), dim=c(3, 4, 5) ) 

, , 1

      [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

, , 2

      [,1] [,2] [,3] [,4]
[1,]   13   16   19   22
[2,]   14   17   20   23
[3,]   15   18   21   24

, , 3

      [,1] [,2] [,3] [,4]
[1,]   25   28   31   34
[2,]   26   29   32   35
[3,]   27   30   33   36

, , 4

      [,1] [,2] [,3] [,4]
[1,]   37   40   43   46
[2,]   38   41   44   47
[3,]   39   42   45   48

, , 5

         [,1] [,2] [,3] [,4]
[1,]   49   52   55   58
[2,]   50   53   56   59
[3,]   51   54   57   60

我正在寻找的是这样一个数组结构——
, , 1

      [,1] [,2] [,3] [,4]
[1,]    1    2    3   4
[2,]    5    6    7   8
[3,]    9    10   11  12

, , 2

      [,1] [,2] [,3] [,4]
[1,]   13   14   15   16
[2,]   17   18   19   20
[3,]   21   22   23   24

, , 3

      [,1] [,2] [,3] [,4]
[1,]   25   26   27   28
[2,]   29   30   31   32
[3,]   33   34   35   36

, , 4

      [,1] [,2] [,3] [,4]
[1,]   37   38   39   40
[2,]   41   42   43   44
[3,]   45   46   47   48

, , 5

      [,1] [,2] [,3] [,4]
[1,]   49   50   51   52
[2,]   53   54   55   56
[3,]   57   58   59   60

一些类似于这种方法simplify2array(lapply(1:ncol(REF), function(x) matrix(REF[,x], nrow=10)))或者sapply(1:ncol(REF), function(x) matrix(REF[,x], nrow=10), simplify="array")可能会奏效。 - Jota
1个回答

4
这个可以行吗?
 new.arr <- array( unlist(dfrm), dim=c(10, 360, 800) ) )

以下是我对任务的理解,如果有误,请注意 'aperm' 包中的 aperm 函数,该函数允许"转换"维度:

d <- as.data.frame( matrix( 1:(3*4*5), 12, 5))
array( unlist(d), dim=c(3, 4, 5) ) 

##=========result============##
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

, , 2

     [,1] [,2] [,3] [,4]
[1,]   13   16   19   22
[2,]   14   17   20   23
[3,]   15   18   21   24

, , 3
snipped rest of output

既然现在明确你想要的是byrow=TRUE的数组等效形式(这不是R数组函数中的选项),那么以下提供所需结果:

 aperm( array( unlist(d), dim=c(4, 3, 5) ) , c(2,1,3) )
#===============
, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

, , 2

     [,1] [,2] [,3] [,4]
[1,]   13   14   15   16
[2,]   17   18   19   20
[3,]   21   22   23   24

Snipped rest of output.

我曾经误以为aperm是在另一个包中。


1
如果ref是一个数据框,将其转换为矩阵会加快速度:array( unlist(as.matrix(dfrm)), dim=c(10, 360, 800) ) )。如果ref一开始就是一个矩阵,则此解决方案比我的评论中的解决方案更快。 - Jota
那个方法确实可行,但它是按行而不是按列组织数据的。你知道是否有类似于“byrow=FALSE”的参数可以用于数组吗? - AtmoSci
如果您创建一个12行5列的小例子并说明您实际想要看到什么,那将会很有帮助。R在矩阵和数组的排序中是按列主序的,因此我没有预料到需要使用byrow=FALSE。它应该填充第一列(第三维的第一个切片)与数据框的前十个项目的第一列,下一列(同一第三维)与接下来的十个项目等等。 - IRTFM
@BondedDust 我在问题上面添加了更好的描述。感谢您的耐心和帮助。 - AtmoSci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接