当操作导致二维矩阵时,保留数组类

时间:2014-04-07 21:02:40

标签: arrays r class matrix

我有一个array,可以有一个或多个页面或工作表(我的名字是第三个维度)。我正在尝试对array执行操作。当只有一个工作表或页面时,操作结果为matrix。我希望结果是array。即使操作结果只有1页或页面,有没有办法保留类array

这是一个例子。我希望my.var.2my.var.3array。这里变量my.pages设置为1,这似乎导致了问题。但是,my.pages可以是>1。如果my.pages <- 2my.var.2my.var.3array

set.seed(1234)

my.rows    <- 10
my.columns <- 4
my.pages   <- 1

my.var.1 <- array( rnorm((my.rows*my.columns*my.pages), 10, 2),
                        c(my.rows,my.columns,my.pages))
my.var.1

my.var.2 <-  2 * my.var.1[,-my.columns,]
my.var.3 <- 10 * my.var.1[,-1,]

class(my.var.2)
class(my.var.3)

my.var.2 <- as.array(my.var.2)
my.var.3 <- as.array(my.var.3)

class(my.var.2)
class(my.var.3)

my.var.2 <- as.array( 2 * my.var.1[,-my.columns,])
my.var.3 <- as.array(10 * my.var.1[,-1,]         )

class(my.var.2)
class(my.var.3)

当我尝试在嵌套matrix中使用my.var.1my.var.2时,切换到for-loop会导致问题。

以下if声明似乎解决了这个问题,但似乎也有点笨拙。有更优雅的解决方案吗?

if(my.pages == 1) {my.var.2 <- array(my.var.2, c(my.rows,(my.columns-1),my.pages))}

1 个答案:

答案 0 :(得分:1)

来自help([)

Usage:
     x[i, j, ... , drop = TRUE]
...
drop: For matrices and arrays.  If 'TRUE' the result is coerced to
      the lowest possible dimension (see the examples).  This only
      works for extracting elements, not for the replacement.  See
      'drop' for further details.

您的代码,重新访问:

set.seed(1234)

my.rows    <- 10
my.columns <- 4
my.pages   <- 1

my.var.1 <- array( rnorm((my.rows*my.columns*my.pages), 10, 2),
                        c(my.rows,my.columns,my.pages))
my.var.2 <-  2 * my.var.1[,-my.columns,,drop=FALSE]
my.var.3 <- 10 * my.var.1[,-1,,drop=FALSE]

class(my.var.2)
## [1] "array"
class(my.var.3)
## [1] "array"