R-日期间隔和日期行数

时间:2018-12-17 00:18:55

标签: r

我有一个关于更快地计算日期间隔的方法的问题

我的输入:

  • 一个数据帧:一对一行(人,一段)。在每一行上,我都有一个人的ID,开始日期和结束日期。
  • 一段时间:两年内所有日期都在逐日显示

我想做的是按日期计算我的约会人数。 我有一个有效的代码,但对于大型数据集(〜从100 k到1 M行),效率不足。

当前问题是因为我有两年的约会,所以我的代码执行了730次(365x2)以下步骤:

  • 使用开始日期和结束日期之间的特定日期过滤数据集
  • 计算过滤后的数据集中唯一ID的数量 而且对于大型数据集,这些操作非常长,甚至是不可能的

我想知道是否存在更好,更快的方式来执行这些操作,例如聚合或其他技术。

输入和输出较短的示例:

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)))

谢谢。

1 个答案:

答案 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)})
相关问题