У меня следующая проблема. У меня есть два вектора с символами (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
должны быть 233, 246, 145, 52, 74. Я также немного отредактировал код, так как забыл включить d.diff <-
перед первой функцией ifelse.
Мы можем сделать это с помощью простого цикла 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
каков будет ваш ожидаемый результат? окончательные значения в
d.diff
?