在R,NULL与NA中分配矩阵的最佳方法是什么?

pou*_*def 33 r matrix

我正在编写R代码来创建一个方阵.所以我的方法是:

  1. 分配正确大小的矩阵
  2. 遍历矩阵的每个元素并用适当的值填充它

我的问题很简单:预先分配这个矩阵的最佳方法是什么?到目前为止,我有两种方式:

> x <- matrix(data=NA,nrow=3,ncol=3)
> x
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA
[3,]   NA   NA   NA
Run Code Online (Sandbox Code Playgroud)

要么

> x <- list()
> length(x) <- 3^2
> dim(x) <- c(3,3)
> x
     [,1] [,2] [,3]
[1,] NULL NULL NULL
[2,] NULL NULL NULL
[3,] NULL NULL NULL
Run Code Online (Sandbox Code Playgroud)

据我所知,前者比后者更简洁.此外,前者用NA填充矩阵,而后者填充NULL.

这是"更好"的方法吗?在这种情况下,我将"更好"定义为"更好的性能",因为这是统计计算,并且此操作将在大型数据集中进行.

虽然前者更简洁,但理解起来并不令人惊讶,所以我觉得这可能是两种方式.

另外,R中NA和NULL之间有什么区别??NA和?NULL告诉我"NA"的长度为"1",而NULL的长度为"0" - 但这里有更多吗?还是最佳做法?这将影响我用于创建矩阵的方法.

Sha*_*ane 46

如有疑问,请测试自己.第一种方法既简单又快捷.

> create.matrix <- function(size) {
+ x <- matrix()
+ length(x) <- size^2
+ dim(x) <- c(size,size)
+ x
+ }
> 
> system.time(x <- matrix(data=NA,nrow=10000,ncol=10000))
   user  system elapsed 
   4.59    0.23    4.84 
> system.time(y <- create.matrix(size=10000))
   user  system elapsed 
   0.59    0.97   15.81 
> identical(x,y)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

关于NA和NULL之间的区别:

实际上有四个特殊常数.

此外,还有四个特殊常量,NULL,NA,Inf和NaN.

NULL用于指示空对象.NA用于缺少("不可用")数据值.Inf表示无穷大,并且NaN在IEEE浮点演算中不是a数(例如,操作的结果分别为1/0和0/0).

您可以在R手册中阅读有关语言定义的更多信息.