Проблема с вложенной функцией ifelse для вычитания определенных дат из вектора дат

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

1) Если c.vec == 'Дерево' и месяц 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. Спасибо за помощь!

каков будет ваш ожидаемый результат? окончательные значения в d.diff ?

Ronak Shah 30.05.2019 05:08

Если я правильно рассчитал, окончательные значения в d.diff должны быть 233, 246, 145, 52, 74. Я также немного отредактировал код, так как забыл включить d.diff <- перед первой функцией ifelse.

sh_student 30.05.2019 05:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мы можем сделать это с помощью простого цикла 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

Другие вопросы по теме