2012-12-19 112 views
1

我使用了一個包含大約300萬個觀察值的非常大的數據集,並且如果它們滿足特定要求,我想通過並實質性地組合某些觀察值。我已經寫了一個for循環來做到這一點,但效率很低。有沒有更有效的方法,比如說使用函數或其他方法,可以改進這一點?在R中向量化for循環

nobs <- nrow(acsdata) 

for (i in 2:nobs){ 

    if (acsdata[i,6]==1 & acsdata[(i-1),6]==1) acsdata[(i-1),3]=2 

    if (acsdata[i,6]==1 & acsdata[(i-1),6]==1) acsdata[(i-1),21:30]=acsdata[(i-1),21:30]+acsdata[i,21:30] 

    if (acsdata[i,6]==1 & acsdata[(i-1),6]==1) acsdata[(i),31]=1 

} 

任何幫助將不勝感激。謝謝!

+2

您的數據正在尋求列名稱。 – flodel

回答

8

只是矢量化。不要混淆循環或應用函數。類似(未經測試):

to.fix <- which(acsdata[ 2:nobs, 6] == 1 & acsdata[ 1:(nobs - 1), 6] == 1) 
acsdata[to.fix, 3] <- 2 
acsdata[to.fix, 21:30] <- acsdata[to.fix, 21:30] + acsdata[to.fix + 1, 21:30] 
acsdata[to.fix + 1, 31] <- 1 
+3

+1,但'fix'是一個函數名稱,所以也許命名索引'to.fix'? –

+0

非常感謝!這正是我想要的,非常有效。萬分感謝! – mjdub

+0

@DWin:現在修復了'fix',謝謝你的注意。雖然我相信你知道,儘管不要衝突是一種好的做法,但它實際上不會引起問題,因爲函數的查找方式與其他對象不同。 – Aaron