首页 > 解决方案 > 如何使用 ifelse 添加日期

问题描述

我有一个数据框,其中包含一个日期列和一个名为 Rule 的文本列。如果规则列中的文本是“ Rule_1”,我想将该行中的日期添加 3 年,但如果“ Rule_2”则为 2 年。

Date        Rule     NewDate
2010-01-01  Rule_1   2013-01-01
2012-01-01  Rule_2   2014-01-01
2015-01-01  No_Rule  2015-01-01

我似乎在使用添加年份时遇到问题lubridate

 ifelse(df$Rule=="Rule1",df$Date %m+% years(3),df$Date)

它将添加的日期转换为一个数字,我认为该数字是从原点开始的天数(?1970)。但是,如果我在df$Date %m+% years(3)没有 ifelse 的情况下运行表达式,那么它可以正常工作。该怎么办?

标签: r

解决方案


既然您已经在使用一个tidyverse包 ( lubridate),那么case_whenfromdplyr呢?这是一个向量化的-如果您有多个条件if,基本上可以让您避免一堆嵌套语句。ifelse

library(dplyr)
df %>% 
  mutate(NewDate_Demo = case_when(Rule == "Rule_1" ~ Date %m+% years(3),
                          Rule == "Rule_2" ~ Date %m+% years(2),
                          TRUE ~ Date))
# A tibble: 3 x 4
  Date       Rule    NewDate    NewDate_Demo
  <date>     <chr>   <date>     <date>      
1 2010-01-01 Rule_1  2013-01-01 2013-01-01  
2 2012-01-01 Rule_2  2014-01-01 2014-01-01  
3 2015-01-01 No_Rule 2015-01-01 2015-01-01  

dplyr也提供if_else,它具有与 https://github.com/tidyverse/lubridate/issues/644 相同的通用语法,base::ifelse但不会与lubridate https://github.com/tidyverse/lubridate/issues/644


推荐阅读