2016-08-08 2 views
0

Я пытаюсь создать функцию в R, которая реплицирует функцию EOMonth Excel (то есть вы вводите дату и количество месяцев и возвращает дату окончания месяца такое же количество месяцев до/после даты ввода). У меня есть есть функция, которая работает на одном входе с использованием пакета lubridate:Работа с NA в векторах с определенными пользователем функциями

EOMonth <- function(date, months) 
{ 
    NewDate <- date %m+% months(months) 
    NewDate <- ceiling_date(NewDate, "month") - days(1) 
} 

Проблема заключается в том, как «vectorise» это (не уверен, что это правильное слово). Когда я передать функции вектора (в данном случае столбец в кадре данных), я получаю следующее сообщение:

NAs не допускаются в подстрочных присвоений

Я не хочу игнорировать любые NA в векторе (потому что я отправляю результаты в новый столбец в фрейме данных). Я просто хочу, чтобы функция, когда она видит NA, возвращает NA, но обрабатывает все допустимые даты, как это диктует функция. Я действительно запутался в том, как это сделать; большинство сообщений, которые я видел по этой теме, относятся к тому, как игнорировать/удалять NA из результатов.

Любая помощь была бы принята с благодарностью.

Спасибо.

Редактировать. Добавлено в некоторые примеры данных. Ниже приведен пример входных данных:

01/07/2016 
NA 
22/07/2016 
NA 
30/06/2016 
22/07/2016 
22/07/2016 
29/07/2016 
NA 
22/07/2016 
30/06/2016 
NA 
31/01/2016 
02/08/2016 

Таким образом, введя следующее:

newVector <- EOMonth(OldVector, 3) 

Если вернуться к концу месяца на каждую дату через 3 месяца:

31/10/2016 
NA 
31/10/2016 
NA 
30/09/2016 
31/10/2016 
31/10/2016 
31/10/2016 
NA 
31/10/2016 
30/09/2016 
NA 
NA 
30/04/2016 
30/11/2016 
+0

Есть ли у вас данные примера? Это очень важно, чтобы люди быстро ответили на ваш вопрос. –

+0

Привет, Sander. Конечно. Должен ли я просто вставить свой оригинальный комментарий? Я редко задаю вопрос на сайте, так что немного невежественный. Сожалею. – sotiris

+0

Вы можете отредактировать свой вопрос и добавить пример данных! Вы можете просто сделать '' 'head (dput())' '' на вашем фреймворке данных. –

ответ

1

Одним из решений является создание вектора NA, а затем обработка только не-NA элементов date. Обратите внимание, что класс NA должен быть date или даты преобразуются в числовые.

EOMonth <- function(date, months) 
{ 
    NewDate <- date(rep(NA, length(date))) 
    NewDate[!is.na(date)] <- date[!is.na(date)] %m+% months(months) 
    NewDate[!is.na(date)] <- ceiling_date(NewDate[!is.na(date)], "month") - days(1) 
    NewDate 
} 

EOMonth(OldVector, 3) 
+0

Это блестяще и работает как шарм. Спасибо, Ричард. Отметьте как мой ответ. – sotiris

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