我有一個很大的data.frame,有數千行,我每次循環創建第1行的一個子集,然後遞增一個額外的行,每次迭代。當涉及多個任務和/或if語句時避免出現循環
在每個子集上,我執行幾個任務,這些任務來自對編程的pythonic理解,我用'for'循環執行。例如。
df <- data.frame(a=c(1:10), b=c(11:20), c=c(21:30), d=c(31:40))
for (index in 1:nrow(df)) {
thisSubset <- df[1: index,]
#loop 1
new1 <- ncumeric(nrow(thisSubset))
for (i in 1:nrow(thisSubset)) {
var1 = 5 - thisSubset$b[i]
new1[i] <- 1/exp(var1*log(2));
}
#loop 2
new2 <- numeric()
for (i in 1:nrow(thisSubset)) if (thisSubset$c[i] >25) {
new2<- c(new2, (thisSubset$a[i]/exp(5*log(2))))
}
#loop 3
new3 <- numeric(nrow(thisSubset))
for (i in 1:nrow(thisSubset)) if (thisSubset$a[i] < 5) {
new3[i] <- thisSubset$d[i]-thisSubset$d[i+1]/2
} else {
new3[i] <- thisSubset$d[i]-thisSubset$d[i-1]/2
}
#loop x
#...
}
隨着我的數據集越來越大,處理時間呈指數增長到幾個小時。我很感激在R中有更好的方式來執行類似的任務(例如apply),但是當每個循環中發生幾件事情時,以及每行中有多個元素被使用時,我還可以使用'for'以外的任何東西嗎?如果有人能夠給我一個上面提到的每個或任何循環的例子,我將不勝感激。
您可能會從查看data.table包的文檔中受益。這提供了簡單的子集和操作(一旦你瞭解了最初的語法學習曲線)。 – ds440
通常,嘗試在任何循環之前移動「矢量化」的所有計算。例如。不需要遍歷每個'thisSubset $ b [i]'從5中減去它,並且在外部循環之前可以保存一個變量'5 - df $ b',以避免多次減法。 (1)'new1 = 1/exp((5 - thisSubset $ b)* log(2))',(2)'new2 = thisSubset $ a [這個子集$ c> 25]/exp(5 * log(2))'和(3)'new3 = ifelse(thisSubset $ a <5,thisSubset $ d - c(thisSubset $ d [-1],NA)/ 2,thisSubset $ d - c(NA,thisSubset $ d [-nrow(thisSubset)])/ 2)' –
您能解釋一下它是如何工作的,而c(thisSubset $ d [-1],NA)'是等價的到'thisSubset $ d [i + 1]'以及'c(NA,thisSubset $ d [-nrow(thisSubset)])'等價於'thisSubset $ d [i-1]'?謝謝 – Tony