[英]avoid for-loop in R
我確定之前已經發布了類似的問題,但沒有一個答案我找不到特定於我的查詢的答案。
我有以下代碼,它檢查第2列中的每一行的值“STRT”,如果找不到該值,它將從上一行復制第3列中的值。 目前這個程序運行時間超過1小時,因為我有一個行數超過300,000的數據集。
for (i in 1:nrow(RTable)) {
if (RTable[i,2] != "STRT") {
RTable[i,3] <- RTable[i-1,3]
}
}
理想情況下,我希望有一個看起來像這樣的解決方案
ifelse(RTable $ col2!=“STRT”,RTable $ col3 [當前行] = RTable $ col3 [當前行-1]
任何幫助,將不勝感激。 在此先感謝您的幫助!!!
創建一個臨時變量
RTable$col4<-lag(RTable$col3)
根據需要使用ifelse
library(dplyr)
RTable %>% mutate(col3=ifelse(col2!="STRT",col3,col4))
我們可以使用data.table
。 將'data.frame'轉換為'data.table'( setDT(RTable)
),使用shift
(“col4”)創建'col3'的lag
,並將'col4'的值分配( :=
)為'col3' '其中col2
不等於“STRT”。
library(data.table)
setDT(RTable)[, col4 := shift(col3)][col2!="STRT", col3 := col4]
可能會創建第四列,這是您的第三列移位,然后使用您的ifelse
語句:
a = c(0,0,0,0) # just so the column indices match to yours
x = c(1,2,3,4)
y = c(2,3,4,5)
RTable = data.frame(a,x,y)
RTable[,4] = c(0,RTable[-nrow(RTable),3]) # Delete last value in column and add one to the beginning
# ifelse(RTable$col2 != "STRT", RTable$col3, RTable$col4)
我不知道您的數據的局限性,但這是一個選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.