嵌套 ifelse 函数从日期向量中减去特定日期的问题

sh_student

我有以下问题。我有两个带有字符(c.vec)的向量,一个带有日期(d.vec)。如果 char 向量具有某个属性,我想计算某个时间间隔。由于 if 语句应该检查每一行,我读到我需要使用嵌套的 ifelse 语句(对于日期向量中的某些月份,应使用特定日期来计算时间间隔)。我的 ifelse 语句计算如下:

1) 如果 c.vec == 'Tree' 并且 d.vec 的月份在 10 月之后 – 然后计算 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 == 'Tree' 并且 d.vec 的月份在 5 月之前 – 然后计算 15.07.YearOfd.vec- d.vec 的日期并用结果覆盖 d.diff

4) 如果 c.vec =! 'Tree' 然后只使用已经存储在 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。谢谢您的帮助!

罗纳克·沙阿

我们可以通过一个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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章