Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
R 生长矢量化_R_Loops_Vectorization_Large Data - Fatal编程技术网

R 生长矢量化

R 生长矢量化,r,loops,vectorization,large-data,R,Loops,Vectorization,Large Data,我正在寻找通过在R中应用矢量化实现以下简单增长率公式的解决方案: gr <- function(x){ a <- matrix(,nrow=nrow(x),ncol=ncol(x)) for (j in 1:ncol(x)){ for (i in 2:nrow(x)){ if (!is.na(x[i,j]) & !is.na(x[i-1,j]) & x[i-1,j] != 0){ result[i,j] <

我正在寻找通过在R中应用矢量化实现以下简单增长率公式的解决方案:

gr <- function(x){
a <- matrix(,nrow=nrow(x),ncol=ncol(x))
   for (j in 1:ncol(x)){
      for (i in 2:nrow(x)){
        if (!is.na(x[i,j]) & !is.na(x[i-1,j]) & x[i-1,j] != 0){
           result[i,j] <- x[i,j]/x[i-1,j]-1 
        }
       }
    }
return(a)
}
生成:

      [,1] [,2] [,3]
[1,]  1.0  3.9  1.3
[2,]  2.0  0.0  2.0
[3,]  3.0  1.0   NA
[4,]   NA  3.0  7.0
[5,]  2.4  0.0  3.9
[6,]  2.8  2.0  2.4
正确的结果,由
gr(m)
生成:


但对于大桌子来说,这需要很长时间。有没有办法在不进行如此广泛循环的情况下使用条件?

您可以通过在一个向量化操作中执行整个计算来加快速度(每次除以0时,都有一个额外的操作来修正结果):


out您可以通过在单个矢量化操作中执行整个计算来加快计算速度(每当您除以0时,还需要一个额外的操作来修正结果):


out以下是几种方法:

1)无套餐

rbind(NA, exp(diff(log(m)))-1)
给予:

          [,1] [,2]       [,3]
[1,]        NA   NA         NA
[2,] 1.0000000   -1  0.5384615
[3,] 0.5000000  Inf         NA
[4,]        NA    2         NA
[5,]        NA   -1 -0.4428571
[6,] 0.1666667  Inf -0.3846154
如果第一行NA不重要,那么可以简化为
exp(diff(log(m))-1

2)zoo另一种方法是使用zoo的Geometric diff函数。转换为zoo,取几何差并减去1。如果重要的是要有第一行NAs,那么将其与具有原始时间点的零宽度序列合并(否则省略merge语句,只使用
g
作为答案):

图书馆(动物园)

zm以下是几种方法:

1)无套餐

rbind(NA, exp(diff(log(m)))-1)
给予:

          [,1] [,2]       [,3]
[1,]        NA   NA         NA
[2,] 1.0000000   -1  0.5384615
[3,] 0.5000000  Inf         NA
[4,]        NA    2         NA
[5,]        NA   -1 -0.4428571
[6,] 0.1666667  Inf -0.3846154
如果第一行NA不重要,那么可以简化为
exp(diff(log(m))-1

2)zoo另一种方法是使用zoo的Geometric diff函数。转换为zoo,取几何差并减去1。如果重要的是要有第一行NAs,那么将其与具有原始时间点的零宽度序列合并(否则省略merge语句,只使用
g
作为答案):

图书馆(动物园)

zm谢谢,这也非常好用!但是,我希望有简单的返回并删除
Infs
。但是从上一个答案我知道怎么做了。谢谢,这也很好用!但是,我希望有简单的返回并删除
Infs
。但是从上一个答案我知道现在该怎么做了。
rbind(NA, exp(diff(log(m)))-1)
          [,1] [,2]       [,3]
[1,]        NA   NA         NA
[2,] 1.0000000   -1  0.5384615
[3,] 0.5000000  Inf         NA
[4,]        NA    2         NA
[5,]        NA   -1 -0.4428571
[6,] 0.1666667  Inf -0.3846154
library(zoo)

zm <- as.zoo(m)
g <- diff(zm, arithmetic = FALSE) - 1
merge(g, zoo(, time(zm))) # omit this line if 1st row of NAs not needed

giving:

        g.1 g.2        g.3
1        NA  NA         NA
2 1.0000000  -1  0.5384615
3 0.5000000 Inf         NA
4        NA   2         NA
5        NA  -1 -0.4428571
6 0.1666667 Inf -0.3846154