我在与客户的两个日期(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*
答案 0 :(得分:1)
使用dplyr
,这是一种方法。我们首先创建一个date1
和date2
之间的日期序列,并得到月年的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