Проблема с вложенной функцией ifelse для вычитания определенных дат из вектора дат - PullRequest
0 голосов
/ 30 мая 2019

У меня следующая проблема. У меня есть два вектора с символами (c.vec), один с датами (d.vec). Я хочу вычислить определенный интервал времени, если вектор символа имеет определенный атрибут. Поскольку оператор if должен проверять каждую строку, я прочитал, что мне нужно использовать вложенные операторы ifelse (как и для определенных месяцев в векторе дат, для вычисления временного интервала должна использоваться конкретная дата). Мое утверждение ifelse должно рассчитываться следующим образом:

1) Если c.vec == 'Tree' и месяц d.vec после октября - тогда вычислите 15.07.YearAfterd.vec - дату d.vec и перезапишите другой вектор с именем d.diff (этот вектор в нем уже хранятся числовые значения) с результатом

2) Если c.vec == 'Tree' и месяц d.vec после мая - рассчитайте 15.02.YearAfterd.vec - дату d.vec и перезапишите d.diff с результатом

3) Если c.vec == «Дерево» и месяц d.vec до мая - вычислите 15.07.YearOfd.vec- дату d.vec и перезапишите d.diff с результатом

4) Если c.vec =! Затем «дерево» просто используйте значение, уже сохраненное в d.diff, и ничего не перезаписывайте

Вот что я пробовал (однако он просто возвращает NA) - с примером:

c.vec <- c('tree','tree','tree','flower','flower')
d.diff <- c(150,80,97,52,74)
d.vec <- as.Date(c('2016-11-24','2017-06-14','2016-02-21','2017-05-07','2016-04-18'))

d.diff <- ifelse(c.vec=='tree',
             # Check if date is after October. The as.Date() part should return 15.07. of the year after d.vec
             ifelse(month(d.vec)>10,d.diff <- as.numeric(as.Date(
               capture.output(cat(year(d.vec)+1,'-07-15')),'%Y -%m-%d')-d.vec),
               # Check if date is after May
               ifelse(month(d.vec)>5,d.diff <- as.numeric(as.Date(
                 capture.output(cat(year(d.vec)+1,'-02-15')),'%Y -%m-%d')-d.vec),
                 # Else, use 15.07. of the year of d.vec to calculate the time difference
                 d.diff <- as.Date(capture.output(cat(year(d.vec),'-07-15')),'%Y -%m-%d')-d.vec)),
             # if c.vec =! tree just use the existing values in d.diff
             d.diff <- d.diff)

Как мне настроить его так, чтобы я получал конкретные временные различия в векторе d.diff? Я также попытался использовать сохранение векторов во фрейме данных, а затем использовать df.name $ ..., чтобы использовать записи векторов, но он также просто возвращает NA. Спасибо за помощь!

1 Ответ

0 голосов
/ 30 мая 2019

Мы можем сделать это с помощью простого цикла for, используя только базовую R

for (i in seq_along(d.vec)) {
   if (c.vec[i] == "tree") {
     current_date <- d.vec[i]
     current_month <- as.integer(format(current_date, "%m"))
     current_year <- as.integer(format(current_date, "%Y"))

    if (current_month > 10) 
      d.diff[i] <-  as.numeric(as.Date(paste0(current_year + 1, "-07-15")) - current_date)
    else if (current_month > 5) 
       d.diff[i] <- as.numeric(as.Date(paste0(current_year + 1, "-02-15")) - current_date)
    else
       d.diff[i] <- as.numeric(as.Date(paste0(current_year, "-07-15")) - current_date)
    }
}

d.diff
#[1] 233 246 145  52  74
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...