2015-11-09 4 views
0

Я пытаюсь вычислить среднюю дату, не зависящую от года для каждого уровня фактора.Рассчитать среднюю дату по годам

DF <- data.frame(Date = seq(as.Date("2013-2-15"), by = "day", length.out = 730)) 
DF$ID = rep(c("AAA", "BBB", "CCC"), length.out = 730) 
head(DF) 

     Date ID 
1 2013-02-15 AAA 
2 2013-02-16 BBB 
3 2013-02-17 CCC 
4 2013-02-18 AAA 
5 2013-02-19 BBB 
6 2013-02-20 CCC 

С учетом указанных выше данных и кода ниже, можно вычислить дату среднее для каждого фактора, но это включает в себя год.

Я хочу средний месяц и день через годы. Предпочтительным результатом будет класс времени POSIXct, отформатированный как месяц-день (например, 12-31 для 31 декабря), представляющий средний месяц и день в течение нескольких лет.

library(dplyr) 
DF2 <- DF %>% group_by(ID) %>% mutate(
    Col = mean(Date, na.rm = T)) 
DF2 

Добавление Ищу средний день года с месяц и день компонента, для каждого уровня фактора. Если дата представляет собой, например, дату, когда животное воспроизводится, меня не интересуют ежегодные различия между годами, но вместо этого нужно иметь один средний день.

I Конечный результат будет выглядеть DF2 но с новым значением, рассчитанным, как описано ранее (средний день года с компонентом месяц день.

К сожалению, это не было понятнее.

+2

Я могу представить несколько различных способов определения этого. Средняя дата на протяжении всего промежутка времени (у него будет компонент год, месяц и день). Или средний день года (у него будет месяц и день компонента. Или средний месяц, а затем средний день. –

+0

Пожалуйста, покажите нам желаемый результат. –

+0

Я добавил несколько особенностей в ваш запрос. –

ответ

3

Если я правильно поняли ваш вопрос, вот как получить столбец средней даты. Сначала я извлекаю день года с yday от POSIXlt. Затем я вычисляю mean. Чтобы получить дату, я должен добавить эти дни в фактический год, следовательно, создание объекта Year.Как просил, я помещал результаты в том же формате, что и DF2 в вашем примере.

library(dplyr) 
DF2 <- DF %>% 
mutate(Year=format(Date,"%Y"), 
Date_day=as.POSIXlt(Date, origin = "1960-01-01")$yday)%>% 
group_by(ID) %>% 
mutate(Col = mean(Date_day, na.rm = T),Mean_date=format(as.Date(paste0(Year,"-01-01"))+Col,"%m-%d"))%>% 
select(Date,ID,Mean_date) 
DF2 
> DF2 
Source: local data frame [730 x 3] 
Groups: ID [3] 

     Date ID Mean_date 
     (date) (chr)  (chr) 
1 2013-02-15 AAA  07-02 
2 2013-02-16 BBB  07-02 
3 2013-02-17 CCC  07-01 
4 2013-02-18 AAA  07-02 
5 2013-02-19 BBB  07-02 
6 2013-02-20 CCC  07-01 
7 2013-02-21 AAA  07-02 
8 2013-02-22 BBB  07-02 
9 2013-02-23 CCC  07-01 
10 2013-02-24 AAA  07-02 
..  ... ...  ... 
+0

Вам нужно сделать столбец «Year», вместо этого вы можете просто вставить произвольный год, например 'as.Date (« 1911-01-01 ») + Col'? I догадываться, что единственная разница будет заключаться в несоответствиях в 'ID' за високосные годы. – Frank

Смежные вопросы