从具有开始和结束日期的数据中计算每月活跃剧集的数量
Count the number of active episodes per month from data with start and end dates
我正在尝试获取每月活跃客户的数量,使用的数据具有每个客户剧集的开始和结束日期。我使用的代码无法弄清楚如何按月计数,而不是每 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)))
哪个returns:
x freq
1 2014-01-01 1
2 2014-01-02 2
3 2014-01-03 4
4 2014-01-04 2
"by" 参数可以更改为我想要的任意天数,但问题出现了,因为月份的长度不同。
谁能建议我如何计算每个月?
非常感谢。
注意:我现在意识到,对于我的示例数据,我只使用了同一个月的日期,但我的真实数据的日期跨度为 3 年。
这是一个似乎有效的解决方案。首先,我设置种子以便示例可重现。
# 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")
}
是的,这是棘手的一点。我使用 mapply
将函数 mon_seq
应用于数据框中的所有行。这给出了每个开始日期和结束日期之间的月份。然后,我将所有这些月份组合成一个向量。我格式化这个向量,使日期只包含月份和年份。最后,我将其通过管道(使用 dplyr
的 %>%
)传输到 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
我正在尝试获取每月活跃客户的数量,使用的数据具有每个客户剧集的开始和结束日期。我使用的代码无法弄清楚如何按月计数,而不是每 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)))
哪个returns:
x freq
1 2014-01-01 1
2 2014-01-02 2
3 2014-01-03 4
4 2014-01-04 2
"by" 参数可以更改为我想要的任意天数,但问题出现了,因为月份的长度不同。
谁能建议我如何计算每个月?
非常感谢。
注意:我现在意识到,对于我的示例数据,我只使用了同一个月的日期,但我的真实数据的日期跨度为 3 年。
这是一个似乎有效的解决方案。首先,我设置种子以便示例可重现。
# 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")
}
是的,这是棘手的一点。我使用 mapply
将函数 mon_seq
应用于数据框中的所有行。这给出了每个开始日期和结束日期之间的月份。然后,我将所有这些月份组合成一个向量。我格式化这个向量,使日期只包含月份和年份。最后,我将其通过管道(使用 dplyr
的 %>%
)传输到 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