2016-05-06 7 views
1

Это стыдно: я признаю несколько кусков кода шахты имеют сходную структуру к этому:Как создать переменную идентификатора на основе правила даты катания?

enter image description here

Arghhhh! Неужели настоящие программисты съеживаются, когда видят что-то вроде этого?

Фигура должна быть само за себя: мне нужна переменная Сезон, который возвращает идентификатор «(год-1) _ (год)» на основе столбца WEATHERDATE.

Таким образом, любая строка с датами от 1998-06-15 до 1999-06-14 должна возвращать «1998-1999» под Сезон ID.

Столбец WEATHERDATE просто запускается с 1998-01-01 по TODAY.

Держу пари, для этого есть одно/два вкладыша. Я пробовал пакет zoo, но не успел.

Любой мастер R, чтобы указать мне на очевидное решение, которого я здесь не хватает?

*** непередаваемы Пример:

WEATHERDATE <- seq(as.Date("1998-01-01"), len=99999, by=1) 
VARIABLE <- rnorm(n = length(WEATHERDATE)) 
data_mex <- data.frame(WEATHERDATE, VARIABLE) 
## how to create SEASON based on dates?? 
# I would then run the code block from above, something like: 
data_mex <- within(data_mex, Season[DATEWEATHER >= ymd(StartOfSeason)+365*0 & DATEWEATHER < ymd(StartOfSeason)+365*1 ] <- "1998-1999") 

Конечно решение, где я не должен вернуться и потрогать код каждый год будет идеальным :)

ответ

6

Вы можете использовать cut.Date и seq.Date сделать это в две строки в базе R:

seasons <- format(as.Date(cut.Date(as.Date(data_mex$WEATHERDATE), 
       breaks=seq.Date(as.Date("1997-06-15"), 
       as.Date("2280-06-15", "year"))), "%Y") 
data_mex$seasons <- paste0(seasons, "-", as.numeric(seasons) + 1) 

Примечание Я использовал "2280-06-15" в качестве последней даты для ваших сезонов, но вы можете заменить это Sys.Date(), или когда это подходит для вашей задачи.

Это возвращает:

> head(data_mex) 
    WEATHERDATE VARIABLE seasons 
1 1998-01-01 -0.2260734 1997-1998 
2 1998-01-02 0.3222805 1997-1998 
3 1998-01-03 -0.1554167 1997-1998 
4 1998-01-04 -0.5591154 1997-1998 
5 1998-01-05 1.0729737 1997-1998 
6 1998-01-06 1.0030025 1997-1998 

> tail(data_mex) 
     WEATHERDATE VARIABLE seasons 
99994 2271-10-10 0.59986466 2271-2272 
99995 2271-10-11 0.37304603 2271-2272 
99996 2271-10-12 1.30822156 2271-2272 
99997 2271-10-13 0.01204986 2271-2272 
99998 2271-10-14 0.87340544 2271-2272 
99999 2271-10-15 0.44098083 2271-2272 
+0

Очень приятно, @ajrwhite. tail (data_mex) показывает, что он провалился за последний год (ы) данных. Есть ли шанс, что вы можете исправить это в своем ответе? – Dan

+0

Как я уже говорил, вам нужно указать правильный диапазон в 'seq.Date' в соответствии с вашими данными. В этом случае я изменил 'Sys.Date()' на '" 2280-06-15 "', что даст вам полное представление о вашем наборе данных примера. – ajrwhite

+0

Конечно! Спасибо, @ajrwhite – Dan

1

Вот одно решение вы можно использовать, чтобы получить желаемый результат:

data_mex$seasonId <- 
    with(data_mex, 
     ifelse(as.numeric(format(WEATHERDATE, '%m')) >= 6 & 
       as.numeric(format(WEATHERDATE, '%d')) >= 15, 
       paste(format(WEATHERDATE, '%Y'), 
        as.numeric(format(WEATHERDATE, '%Y')) + 1, sep = '-'), 
       paste(as.numeric(format(WEATHERDATE, '%Y')) - 1, 
        format(WEATHERDATE, '%Y'), sep = '-'))) 

Итоговое выход является:

head(data_mex) 
    WEATHERDATE VARIABLE seasonId 
1 1998-01-01 -0.02541724 1997-1998 
2 1998-01-02 -0.48725913 1997-1998 
3 1998-01-03 0.06204881 1997-1998 
4 1998-01-04 -0.15207281 1997-1998 
5 1998-01-05 -0.61809248 1997-1998 
6 1998-01-06 -1.20427734 1997-1998 

tail(data_mex) 
     WEATHERDATE VARIABLE seasonId 
99994 2271-10-10 -0.8976144 2271-2272 
99995 2271-10-11 -0.5684972 2271-2272 
99996 2271-10-12 -0.8847031 2271-2272 
99997 2271-10-13 -0.2659979 2271-2272 
99998 2271-10-14 -0.9108352 2271-2272 
99999 2271-10-15 1.1601581 2271-2272 

Вы извлекаете часть года каждый раз и вставляете отстающий или ведущий год в зависимости от значения месяца и дня. Метод format позволяет вам извлекать определенные части даты.

+0

спасибо, я в конечном итоге выбор решения ajrwhite»потому, что он короче и я могу использовать переменную StartOfSeason вместо того, чтобы разбить его на куски за месяц и год (6 и 15 в своем решении) – Dan

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

  • Нет связанных вопросов^_^