準備數據,並確保該日期列,實際存儲爲日期:
data <- read.table(text = "User StartDate EndDate
1 2015-09-03 2015-10-17
2 2015-10-27 2015-12-25", header = TRUE)
data$StartDate <- as.Date(StartDate)
data$EndDate <- as.Date(EndDate))
該函數返回的所有月份是訂閱內的一個矢量:
library(lubridate)
subscr_month <- function(start, end) {
start <- floor_date(start, "month")
seq <- seq(start, end, by = "1 month")
months <- format(seq, format = "%Y-%m")
return(months)
}
它使用來自lubridate
包的功能floor_date()
。有必要整理開始日期,否則上個月可能會丟失。例如,對於用戶2,如果您將兩個月添加到開始日期,則最終將在結束日期之後的2015-12-27
之後,以便在seq
之前沒有包含來自12月的日期。最後一行將日期轉換爲僅包含年份和月份的字符。
現在,您可以使用mapply()
從您的數據中將這個函數應用於每個開始日期和結束日期。此後,table()
會在結果列表中的所有日期的計數表:
all_month <- mapply(subscr_month, data$StartDate, data$EndDate, SIMPLIFY = FALSE)
table(unlist(all_month))
## 2015-09 2015-10 2015-11 2015-12
## 1 2 1 1
您還可以將表格轉換成數據幀:
as.data.frame(table(unlist(all_month)))
## Var1 Freq
## 1 2015-09 1
## 2 2015-10 2
## 3 2015-11 1
## 4 2015-12 1
你的榜樣輸出也包括計數個月沒有出現在數據集中。如果你想擁有這一點,你可以在數月的向量轉換爲一個因素,並設置級別給所有要包括月:
month_list <- format(seq(as.Date("2015-08-01"), as.Date("2016-01-01"), by = "1 month"), format = "%Y-%m")
all_month_factor <- factor(unlist(all_month), levels = month_list)
table(all_month_factor)
## all_month_factor
## 2015-08 2015-09 2015-10 2015-11 2015-12 2016-01
## 0 1 2 1 1 0