如何计算没有新客户的月份

时间:2019-09-02 12:02:22

标签: r date dataframe

我在与客户的两个日期(date1,date2)和到达日期之间有一个数据框。

date1<- "2019-07-29"
date2<- "2019-09-08"

clients<-data.frame(id= c(1:10),
                    arrive=c("2019-07-31", "2019-07-29", "2019-08-01",
                             "2019-08-03", "2019-08-05", "2019-08-08", 
                             "2019-08-02", "2019-08-06", "2019-09-29", 
                             "2019-09-02"),
                    hotel= c(rep(900067, 5), rep(9001649,5)))

我想在日期之间进行计数,即每个酒店没有新客户多少个月。

酒店900067在接下来的第9个月没有新客户。而酒店9001649在第7个月没有新客户。

数据框结果应类似于:

Result<- data.frame(hotel= c(900067, 9001649), 
                    days_without_new_clients= c(1, 1))

我尝试过:

month_between_dates<-function(date1, date2){
  month1<-month(date1)
  month2<-month(date2)
  if(month1>month2){
    result<-c(month1:12, 1:month2)
  } else {
    result<-c(month1:month2)
  }
  return(result)
}
all_hotel_month <- expand.grid(arrive = month_between_dates(date1, date2), hotel = unique(clients1$hotel))
clients1 %>%
  mutate(arrive = month(as.Date(arrive))) %>%
  group_by(hotel)%>% 
  summarize(month_without_new_clients = sum(is.na(id)))

但我收到此错误:

 Error in summarize(., month_without_new_clients = sum(is.na(id))) : argument "by" is missing, with no default*

1 个答案:

答案 0 :(得分:1)

使用dplyr,这是一种方法。我们首先创建一个date1date2之间的日期序列,并得到月年的unique组合。我们从clients中提取月份和年份,并在没有新客户的情况下获得每个hotel的月份计数。

unique_my <- unique(format(seq(as.Date(date1), as.Date(date2), "1 day"), "%m-%Y"))

library(dplyr)
clients %>%
   mutate(arrive = as.Date(arrive), 
          month_year = format(arrive, "%m-%Y")) %>%
   group_by(hotel) %>%
   summarise(months_without_new_client = length(setdiff(unique_my, month_year)))

#    hotel months_without_new_client
#    <dbl>                     <int>
#1  900067                         1
#2 9001649                         1