[英]dplyr::if_else - check for condition and insert NA as part of the evaluation
我正在尝试解决一个简单的问题。 我检查一个特定的条件,如果它是真的,我插入一个date
值或插入NA
(即留下一个空白单元格)。
为了if_else
起作用,我正在使用if_else
但它顽固地拒绝工作(我已经投入了几个小时阅读 SO 和帮助页面)。
这是我尝试过但失败的方法:
library(tidyverse)
library(lubridate)
df <- data.frame(date = dmy(c("01/01/2019", "02/01/2019", "03/01/2019")),
status = c("Active", "Suspended", "Active"),
stringsAsFactors = FALSE)
df %>% mutate(sus_date = if_else(status == "suspended", 1, 2)) # This works
df %>% mutate(sus_date = if_else(status == "suspended", date, NA)) # Throws an Error
Error: `false` must be a `Date` object, not a logical vector
Call `rlang::last_error()` to see a backtrace.
df %>% mutate(sus_date = if_else(status == "suspended", date, NA_real_)) # Throws an error
Error in as.Date.numeric(value) : 'origin' must be supplied
这似乎是一个微不足道的问题,不应该花这么长时间才能找到答案!
任何想法如何做到这一点?
附: 我想避免使用base::ifelse
因为它会更改日期格式
您也可以强制NA
生效,即:
df %>% mutate(sus_date = if_else(status == "Suspended", date, ymd(NA)))
date status sus_date
1 2019-01-01 Active <NA>
2 2019-01-02 Suspended 2019-01-02
3 2019-01-03 Active <NA>
if_else
需要true
和false
为相同类型,它返回一个错误,因为
class(NA)
#[1] "logical"
然而
class(df$date)
#[1] "Date"
不幸的是,虽然我们有NA_real
、 NA_character_
等,但日期没有NA
所以你可能应该做的是
library(dplyr)
df %>% mutate(sus_date = as.Date(ifelse(status == "Suspended", date, NA)))
# date status sus_date
#1 2019-01-01 Active <NA>
#2 2019-01-02 Suspended 2019-01-02
#3 2019-01-03 Active <NA>
或者因为您已经在使用基础 R ifelse
transform(df, sus_date = as.Date(ifelse(status == "Suspended", date, NA)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.