R过滤需要异常高的加载时间

时间:2017-10-28 19:34:07

标签: r dataframe

我遇到了一个与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秒内过滤?

1 个答案:

答案 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