r - 如何使用 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 的情况下运行表达式,那么它可以正常工作。该怎么办?
解决方案
既然您已经在使用一个tidyverse
包 ( lubridate
),那么case_when
fromdplyr
呢?这是一个向量化的-如果您有多个条件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
推荐阅读
- asp.net - 如何从 Web API 获取数据到 Xamarin 表单选择器?
- javascript - Get Timer ID in Node.js
- ruby-on-rails - Ruby on Rails 表单错误未提供任何输出/不工作
- django - 如何在模板中的 if 语句中保持模式打开
- java - 带有额外列的多对多映射 - 如何设置映射以及如何序列化?
- java - Java Graphics 不在 if else 或递归内部绘制
- javascript - pdfMake / html2canvas 对于 PDF 输出来说太大了,如何调整大小?
- javascript - 从 popup.js 到内容脚本的 Chrome 扩展传递变量
- javascript - JavaScript 对象属性实例化
- python - 如何将 ulong 类型参数从 Python 传递给 C# 函数?