我正在尝试创建一个可以计算一个月内租金的R函数。它将作为参数:start_date,end_date,当前月份。并返回月份租金天数的整数输出。 (这将用于公寓租赁模式)。
例如,
library(lubridate)
start_date <- ymd('2017-06-15')
end_date <- ymd('2018-06-14')
current_month <- ymd('2017-06-01')
rent_days_in_month(start_date, end_date, current_month)
[1] 16
我有一个我认为有效的功能,但它似乎过于复杂。我也想确保它可以进行矢量化,这样我就可以在mutate的数据框上应用。
这是我的功能:
rent_days_in_month <- function(start_date,
end_date,
current_month){
last_day_in_month <- ceiling_date(current_month,
unit = "months") - 1
current_month_days_in_moth <- days_in_month(current_month)
first_day_in_month <- floor_date(current_month,
unit = "month")
if (last_day_in_month < start_date) {
rent_days_in_month <- 0
return(rent_days_in_month)
}
rent_days_in_month <- as.numeric(end_date - start_date + 1)
rent_days_in_month <- min(rent_days_in_month,
current_month_days_in_moth)
if (end_date < last_day_in_month){
if (end_date > first_day_in_month){
if (start_date > first_day_in_month) {
rent_days_in_month <- end_date - start_date - 1
return(rent_days_in_month)
} else {
rent_days_in_month <- end_date - first_day_in_month
return(rent_days_in_month)
}
} else {
rent_days_in_month <- 0
return(rent_days_in_month)
}
}
return(rent_days_in_month)
}
然后我尝试将它像这样进行矢量化:
v_rent_days_in_month <- Vectorize(rent_days_in_month)
那里有什么比这更简单的工作吗?另外,想知道这是否正确使用了Vectorize函数。
由于
答案 0 :(得分:0)
library(lubridate)
start_date <- as.Date('2017-06-15')
end_date <- as.Date('2018-06-14')
days <- seq(start_date, end_date, by= 'days')
lapply(split(days, month(days)), length)
使用seq
函数和参数by ='days'来获取所有那些日期的向量。然后按月和总和分成一个列表。
答案 1 :(得分:0)
library(lubridate)
start_date <- as.Date("2017-06-15")
end_date <- as.Date("2018-06-14")
current_month<- as.Date("2017-06-01")
rent_days_in_month = function(start_date, end_date, current_month){
if(month(current_month) == month(start_date) & year(current_month) == year(start_date)){
return(as.numeric(difftime(ceiling_date(start_date, "month"), start_date, units = c("days"))))
}else if(current_month < floor_date(start_date, "month") | current_month >= ceiling_date(end_date)){
return("invalid date")
}else if(month(current_month) == month(end_date) & year(current_month) == year(end_date)){
return(as.numeric(difftime(end_date, current_month, units = c("days"))) + 1)
}else{
tmp = ceiling_date(current_month, "month") - 1
return(day(tmp))
}
}
> rent_days_in_month(start_date, end_date, current_month)
[1] 16
> rent_days_in_month(start_date, end_date, as.Date("2015-01-01"))
[1] "invalid date"
> rent_days_in_month(start_date, end_date, as.Date("2018-01-01"))
[1] 31
> rent_days_in_month(start_date, end_date, as.Date("2018-06-01"))
[1] 14