从带有开始日期和结束日期的数据中计算每月活动情节的数量

时间:2018-08-23 09:17:25

标签: r date plyr duration

我正在尝试使用每个客户插曲的开始和结束日期的数据来每月获取活跃客户的数量。我正在使用的代码无法算出每个月的计数方式,而不是每n天计算一次。

以下是一些示例数据:

Start.Date <- as.Date(c("2014-01-01", "2014-01-02","2014-01-03","2014-01-03"))

End.Date<- as.Date(c("2014-01-04", "2014-01-03","2014-01-03","2014-01-04"))

确保日期是日期:

Start.Date <- as.Date(Start.Date, "%d/%m/%Y")

End.Date <- as.Date(End.Date, "%d/%m/%Y")

这是我正在使用的代码,当前该代码每天都在计数:

library(plyr)

count(Reduce(c, Map(seq, start.month, end.month, by = 1)))

返回:

          x freq

1 2014-01-01         1

2 2014-01-02         2

3 2014-01-03         4

4 2014-01-04         2

“ by”参数可以更改为我想要的天数,但是会出现问题,因为月份的长度不同。

任何人都可以提出我每月的计数方法吗?

非常感谢。

注意:我现在意识到,对于我的示例数据,我只使用了同一月份中的日期,但是我的真实数据中的日期跨越了3年。

1 个答案:

答案 0 :(得分:0)

这是一个可行的解决方案。首先,我设置了种子,以使示例可以重现。

# Set seed for reproducible example
set.seed(33550336)

接下来,我创建一个虚拟数据框。

# Test data
df <- data.frame(Start_date = as.Date(sample(seq(as.Date('2014/01/01'), as.Date('2015/01/01'), by="day"), 12))) %>% 
  mutate(End_date = as.Date(Start_date + sample(1:365, 12, replace = TRUE)))

看起来像

#    Start_date   End_date
# 1  2014-11-13 2015-09-26
# 2  2014-05-09 2014-06-16
# 3  2014-07-11 2014-08-16
# 4  2014-01-25 2014-04-23
# 5  2014-05-16 2014-12-19
# 6  2014-11-29 2015-07-11
# 7  2014-09-21 2015-03-30
# 8  2014-09-15 2015-01-03
# 9  2014-09-17 2014-09-26
# 10 2014-12-03 2015-05-08
# 11 2014-08-03 2015-01-12
# 12 2014-01-16 2014-12-12

下面的函数采用开始日期和结束日期,并在这些日期之间创建一个月序列。

# Sequence of months
mon_seq <- function(start, end){
  # Change each day to the first to aid month counting
  day(start) <- 1
  day(end) <- 1

  # Create a sequence of months
  seq(start, end, by = "month")
}

对,这很棘手。我使用mon_seq将函数mapply应用于数据框中的所有行。这给出了每个开始和结束日期之间的月份。然后,我将所有这些月合并为一个向量。我格式化此向量,以便日期仅包含几个月和几年。最后,我将其使用dplyr的{​​{1}}用管道传输到%>%中,该table对年份中的每个月进行计数,并将其转换为数据框。

data.frame(format(do.call("c", mapply(mon_seq, df$Start_date, df$End_date)), "%Y-%m") %>% table)

这给了

#          . Freq
# 1  2014-01    2
# 2  2014-02    2
# 3  2014-03    2
# 4  2014-04    2
# 5  2014-05    3
# 6  2014-06    3
# 7  2014-07    3
# 8  2014-08    4
# 9  2014-09    6
# 10 2014-10    5
# 11 2014-11    7
# 12 2014-12    8
# 13 2015-01    6
# 14 2015-02    4
# 15 2015-03    4
# 16 2015-04    3
# 17 2015-05    3
# 18 2015-06    2
# 19 2015-07    2
# 20 2015-08    1
# 21 2015-09    1