我在计算旅行日期时遇到了问题。我有一个出发日期和返回日期的数据框。
Departure Return
1 7/6/13 8/3/13
2 7/6/13 8/3/13
3 6/28/13 8/7/13
我想创建并传递一个函数,该函数将采用这些日期并形成所有日子的列表。我可以通过将每列转换为日期来单独执行此操作。
## Turn the departure and return dates into a readable format
Dept <- as.Date(travelDates$Dept, format = "%m/%d/%y")
Retn <- as.Date(travelDates$Retn, format = "%m/%d/%y")
travel_dates <- na.omit(data.frame(dept_dates,retn_dates))
seq(from = travel_dates[1,1], to = travel_dates[1,2], by = 1)
这给了我[1] "2013-07-06" "2013-07-07"
......等等。我想缩放以覆盖整个数据框,但我的尝试失败了。
这是我认为可行的。
days_abroad <- data.frame()
get_days <- function(x,y){
all_days <- seq(from = x, to = y, by =1)
c(days_abroad, all_days)
return(days_abroad)
}
get_days(travel_dates$dept_dates, travel_dates$retn_dates)
我收到此错误:
Error in seq.Date(from = x, to = y, by = 1) : 'from' must be of length 1
这可能有很多错误,但我真正想要帮助的是如何通过seq()
运行多个日期。
对不起,如果这很简单(我还在学习思考)并且对于任何违反礼节的行为都抱歉。谢谢。
答案 0 :(得分:1)
编辑:根据OP评论更新。
这个怎么样:
travel_dates[] <- lapply(travel_dates, as.Date, format="%m/%d/%y")
dts <- with(travel_dates, mapply(seq, Departure, Return, by="1 day"))
这将生成一个列表,其中包含与初始表中的行数一样多的项目。然后,您可以进行汇总(这将是data.frame,其中包含日期显示的次数):
data.frame(count=sort(table(Reduce(append, dts)), decreasing=T))
# count
# 2013-07-06 3
# 2013-07-07 3
# 2013-07-08 3
# 2013-07-09 3
# ...
旧代码:
以下是每次旅行的#days,而不是带有日期的列表。
transform(travel_dates, days_away=Return - Departure + 1)
产生:
# Departure Return days_away
# 1 2013-07-06 2013-08-03 29 days
# 2 2013-07-06 2013-08-03 29 days
# 3 2013-06-28 2013-08-07 41 days
如果你想将days_away
放在一个单独的列表中,这是微不足道的,尽管将它作为数据框的附加列似乎更有用。