簡體   English   中英

R:將開始/結束日期轉換為數據系列

[英]R: converting start/end dates into data series

我有以下表示用戶訂閱的數據框:

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

雷姆:我為時間序列取了一些任意的開始日期和結束日期,以使示例更清楚。

准備數據並確保日期列實際上存儲為日期:

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 

讀取提到的數據幀。

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

可以充分利用dplyr包和seqdo

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM