2015-07-12 78 views
0

我想使用sapply的方式,从sapply输出的最新值变成sapply的下一个输入。在下面的例子中,我创建了向量a =(1,NA,NA,NA),并希望sapply返回向量a =(1,1,2,2)。基本上,对于[2:4],我想输出为2-1 = 2,3-1 = 2,4 = 2 = 2使用最后的sapply输出作为下一个输入

a <- NA 
a[1] <- 1 
a[2:4] <- sapply(2:4, function(x) x- a[x-1]) 

如果你运行它,你看到它返回一个=(1,1,NA,NA),因为它使用现有的矢量而不是“现场”矢量。

一个for循环,它的工作原理是这样的:

a <- NA 
a[1] <- 1 
for (ii in 2:4){ 
    a[ii] <- ii-a[ii-1] 
} 

我想sapply使用的原因是因为我真正的功能是复杂的,它会运行在大型数据集,我不想等待很长时间。

谢谢。

+0

使用'sapply'而不是''''''循环写得很好,你不可能实现显着的速度提升。我不明白'2-1 = 2,3-1 = 2,4 = 2 = 2' –

+1

'sapply'不会这样做,即使它可能不会比一口井好得多书面,预先分配'for'循环。有可能你的问题可能是矢量化的,但是如果没有看到你的“真实”功能就不可能知道。否则,对于计算强烈依赖于以前的迭代,我强烈建议** Rcpp **的速度增益。 – joran

+0

@ docendo对不起,这是一个错字。应该是2-1 = 2,3-1 = 2,4-2 = 2。我意识到这并不清楚。显示的循环覆盖了它。 –

回答

1

可以使用功能Reduce

Reduce(f=function(lhs,rhs) rhs-lhs,x=1:4,accumulate=TRUE) 
#[1] 1 1 2 2 

请注意,如果您在大数据运行,这将是缓慢的。

然后最好预先分配一个矢量,并通过for循环来填充它(如@joran建议的那样)。

相关问题