我遇到了一个与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秒内过滤?
答案 0 :(得分:4)
在我的机器上,您的原始代码在~7秒内运行。我注意到data335$ticket_date
被存储为一个因子,因此我将其作为字符串读取并将其强制转换为日期格式。时间下降到0.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