2014-02-14 2 views
2

Я застрял в проблеме расчета даты поездки. У меня есть фрейм данных дат отправления и дат возврата.Данные о датах вылета и возвращения, как мне получить список всех дат?

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

Возможно, функция apply поможет вам преобразовать все в дату и оттуда извлечь список – Llopis

ответ

1

EDIT: обновлен в соответствии с комментарием к ОП.

Как об этом:

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 в отдельном списке, что тривиально, хотя и кажется более полезным, чтобы иметь его в качестве дополнительного столбца фрейма данных.

+0

Спасибо. Но мне жаль, что я не был ясен. Я ищу дату каждого дня, когда человек уезжает, а не только количество дней. Вот почему я пытался использовать seq(). Второй шаг в моем проекте - это выяснить, в какие дни года большинство людей находится вдали от офиса. Спасибо также за то, что я представил мне transform(). – user3307442

+0

@ user3307442, см. Редактирование. Я думаю, что это касается ваших проблем. – BrodieG

+0

Спасибо! Это работает очарование! Я очень благодарен. Я многому научился. – user3307442