2016-03-06 71 views
0

我有以下的數據幀代表用戶訂閱:R:轉換的開始/結束日期,數據系列

User StartDate EndDate 
1  2015-09-03 2015-10-17 
2  2015-10-27 2015-12-25 
... 

我怎樣才能將其轉化爲一個時間序列,讓我隨着時間的推移活性每月訂閱的計數(假設該月至少在一個月內有效)。像這樣的東西(根據上面的例子中,假設只有2條):

Month Count 
2015-08 0 
2015-09 1 
2015-10 2 
2015-11 1 
2015-12 1 
2016-01 0 

REM:我花了一些任意的開始和結束日期爲時間序列,使例子清晰。

回答

0

準備數據,並確保該日期列,實際存儲爲日期:

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 
0

讀提到的數據幀。

df = structure(list(StartDate = structure(c(16681, 16735), class = "Date"), 
    EndDate = structure(c(16735, 16794), class = "Date")), class = "data.frame", .Names = c("StartDate", 
"EndDate"), row.names = c(NA, -2L)) 

能否利用好dodplyr包和seq

df %>% 
     rowwise() %>% do({ 
     w <- seq(.$StartDate,.$EndDate,by = "15 days") #for month difference less than 1 complete month 
     m <- format(w,"%Y-%m") %>% unique 
     data.frame(Month = m) 
     }) %>% 
     group_by(Month) %>% 
     summarise(Count = length(Month)) 
相關問題