我正在撰寫一個代碼,但它有一個非常慢的步驟。基本上我只需要檢查 2 列,如果它們的值相同(在它們各自的行),我在第三列標記 1。就像下面的代碼:
#FLAG_REPETIDOS
df1$FLAG_REPETIDOS <- ""
j <-1
for (j in 1:nrow(df1)) {
df1$FLAG_REPETIDOS[[j]] <- ifelse(df1$DATO[[j]]==df1$DATO_ANT[[j]], 1, df1$FLAG_REPETIDOS[[j]])
df1$FLAG_REPETIDOS[[j]] <- ifelse(is.na(df1$FLAG_REPETIDOS[[j]])==TRUE, "", df1$FLAG_REPETIDOS[[j]])
x <- j/100
if ((x == round(x))==TRUE){
print(paste(j, "/", nrow(df1)))
}
}
print(paste("Check 11:", Sys.time(), sep=" "))
更多資訊:我使用的是資料表,而不是資料框。我的電腦不是最好的,只有 8G RAM,我使用的資料或多或少有 1M 行。因此,據我估計,僅此代碼步驟就需要大約 72 小時才能結束,這是不合理的。
我的代碼是否在做一些可以更輕松、更快地完成的事情?有什么辦法可以優化嗎?我是 R 新手,所以我對優化不太了解。
提前致謝
我已經從資料框更改為資料表,我在谷歌上研究了優化,這是我可以嘗試的事情之一。
uj5u.com熱心網友回復:
使 R 代碼快速運行的方法是將代碼矢量化。
假設df是一個資料框,您可能可以將所有包含的代碼替換為:
library(dplyr)
df %>%
mutate(
FLAG_REPETIDOS = case_when(
is.na(DATO) | is.na(DATO_ANT) ~ "",
DATO == DATO_ANT ~ 1,
TRUE ~ ""
)
)
但是,我無法檢查,因為您的問題中沒有包含任何資料。
uj5u.com熱心網友回復:
您的回圈相當于這個更簡單、更快的代碼。
df1$FLAG_REPETIDOS <- ""
df1$FLAG_REPETIDOS[which(df1$DATO == df1$DATO_ANT)] <- "1"
請注意,which不會有NA在第二個代碼行索引中出現 ' 的危險。
uj5u.com熱心網友回復:
沒有樣本資料很難知道,但這應該使用 data.table
library(data.table)
dt <- data.table(x=c(1,3,5,7,9), y=c(1,2,5,6,7)) # example
dt[, z:='']
dt[x==y, z:='1']
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/452796.html
