我有一个关于更快地计算日期间隔的方法的问题
我的输入:
我想做的是按日期计算我的约会人数。 我有一个有效的代码,但对于大型数据集(〜从100 k到1 M行),效率不足。
当前问题是因为我有两年的约会,所以我的代码执行了730次(365x2)以下步骤:
我想知道是否存在更好,更快的方式来执行这些操作,例如聚合或其他技术。
输入和输出较短的示例:
library(lubridate)
library(dplyr)
# Vector of date
vector_day <- seq(ymd('2017-01-01'), ymd('2018-12-30'), by= "days")
# Input Data
df <- data.frame(
id_people = c(1, 2, 3, 4, 1),
StartDate = c(as.Date("2018-11-01"), as.Date("2018-11-03"),as.Date("2018-12-01"),as.Date("2018-11-15") ,as.Date("2018-11-15")),
EndDate = c(as.Date("2018-11-10"), as.Date("2018-12-04"),as.Date("2018-12-10"),as.Date("2018-11-17"), as.Date("2018-11-23")),
Gender = c("F", "F", "M", "F", "F"))
# Function to compute the number of people given a spécific date
compute_nb_f_by_day <- function(date) {
cond1 <- df_f$StartDate <= date
cond2 <- df_f$EndDate > date
cond <- cond1 & cond2
res <- length(unique(df_f[cond,]$id_people))
return(res)
}
# An example of how the function works for on date
compute_nb_f_by_day(as.Date("2018-12-01"))
# Computation for all the dates
nb_f_by_day <- cbind(
data.frame(vector_day),
data.frame(nb_f_by_day <- sapply(vector_day, compute_nb_f_by_day)))
谢谢。
答案 0 :(得分:0)
此解决方案的基准测试速度明显快于给定示例中的代码(您的代码:0.132s;此代码:0.032s在我的系统中)。尝试一下,看看它对于大型数据集是否会显着改善!
#-- Create the 'Interval'
df2 <- df %>%
mutate(DateInterval = StartDate %--% EndDate)
#-- Create a result df instead of using cbind (more efficient)
result_df <- data.frame(Day = vector_day, Nb = NA)
#-- Get intervals that contain the days in vector_day
result_df$Nb <- sapply(vector_day, function(day) {sum(day %within% df2$DateInterval)})