2017-10-28 52 views
1

我已經遇到一個奇怪的性能問題與R.[R過濾以異常高時加載

我有一個csv file包含接近600,00線和11列。最後一列包含日期。我正在嘗試根據最後一列中的日期是週末還是週日來篩選行。正如你從下面的輸出中可以看到的,這個相對簡單的過濾需要12秒。

> library(lubridate) 
> data335 = read.csv("data335.csv") 
> Sys.time() 
[1] "2017-10-29 00:50:16 IST" 
> delete_variable = data335[ifelse((wday(data335$ticket_date) %in% c("1","6")), T , F),][11] 
> Sys.time() 
[1] "2017-10-29 00:50:28 IST" 

但是,對其他列值的過濾幾乎不需要一兩秒鐘。

> Sys.time() 
[1] "2017-10-29 00:58:58 IST" 
> delete_variable = data335[(data335$route_no == "V-335EUP") ,][11] 
> Sys.time() 
[1] "2017-10-29 00:58:58 IST" 

我敢肯定,在前面的過濾案例中,我沒有用R的方式去做。有沒有辦法讓這段時間在2秒內過濾?

回答

3

在我的機器上,您的原始代碼在7秒內運行。我注意到data335$ticket_date是作爲一個因子存儲的,所以我把它作爲一個字符串讀取並強制轉換爲日期格式。時間降到了1秒。

也取出了if_else語句,因爲%in%已經返回一個邏輯向量。 c(1,7)(你有c(「1」,「6」)),並用數字代替字符,但如果你正在尋找週末,我認爲你需要1 & 7)。這些導致了速度的小幅提升。

library(lubridate) 
data335 <- read.csv('Downloads/data335.csv', stringsAsFactors=FALSE) 
data335$ticket_date <- as.Date(data335$ticket_date, format="%d-%m-%Y") 

start <- Sys.time() 
delete_variable = data335[wday(data335$ticket_date) %in% c(1,7),][11] 
end <- Sys.time() 
end-start