2015-07-12 45 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建議的那樣)。

相關問題