簡體   English   中英

避免R中的for循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM