если выписка с датами в R - обобщение за год - PullRequest
0 голосов
/ 10 октября 2018

Я начинаю со следующего вопроса, чтобы искать свойства обобщения: , если утверждение с датами в R

df <- data.frame(date = as.Date(c("16.04.2015", "04.08.2014", "11.09.2013",
                                  "20.11.2015", "04.04.2014"), '%d.%m.%Y'))

Я хочу идентифицировать все даты между 07-15 (% m-% d) и 12-31, например

> date        value
> 16.04.2015  0
> 04.08.2014  1
> 11.09.2013  1
> 20.11.2015  1
> 04.04.2014  0

Мое решение основано на решении @rawr, опубликованном в приведенном выше вопросе:

Функция для интервала:

`%between%` <- function(x, interval) x >= interval[1] & x <= interval[2]

вектор со всем возможным началом:

begi <- as.Date(sprintf('%s-07-15',1993:2018))

# Vector with all the possible intervals
dates <- as.Date(c(sprintf('%s-07-15',1993:2018), sprintf('%s-12-31',1993:2018))) 

Цикл с использованием функции

df$value <- NA

for (i in length(begi)) {
  ind<-which(format(df$date,"%Y") == format(begi[i], "%Y"))
  df$value[ind] <- 1*(df$date[ind] %between% as.Date(c(begi[i], 
                dates[i+length(begi)])))
}

Если я запускаю i один за другим, я получаю желаемый результат.Однако, если я запустил цикл в последний i, он перезаписывает весь столбец, а не использует только позицию, указанную ind.Почему?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018
df$leapyear <- ifelse(as.integer(format(df$date, "%Y")) %% 4 == 0, 1, 0)
df$leapyear <- ifelse(as.integer(format(df$date, "%Y")) %% 100 == 0, 0, 1)
df$leapyear <- ifelse(as.integer(format(df$date, "%Y")) %% 400 == 0, 1, 0)

df[format(df$date, "%j") > ifelse(df$leapyear == 0, 197, 196), ]

спасибо @ RyanD за указание на то, что подмножество на основе дня года не учитывает високосные годы

0 голосов
/ 10 октября 2018

Вы можете отформатировать даты как %m-%d и использовать сравнение строк

df$value <- as.numeric(format(df$date, '%m-%d') %between% c('07-15', '12-31'))
df
#         date value
# 1 2015-04-16     0
# 2 2014-08-04     1
# 3 2013-09-11     1
# 4 2015-11-20     1
# 5 2014-04-04     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...