首页 > 解决方案 > 考虑了嵌套 ifelse 中的一些条件

问题描述

我与嵌套的 ifelse 斗争。我想根据其他变量的值使用 dplyr::mutate 创建一个新变量。请参阅下面的可复制示例。

library(dplyr)
library(hms)

# make a test dataframe
datetime <- as.POSIXct(c("2015-01-26 10:10:00 UTC","2015-01-26 10:20:00 UTC","2015-01-26 10:30:00 UTC", "2015-01-26 10:40:00 UTC","2015-01-26 10:50:00 UTC","2015-01-26 11:00:00 UTC","2015-01-26 00:10:00 UTC","2015-01-26 11:20:00 UTC","2015-01-26 11:30:00 UTC","2017-03-10 10:00:00 UTC"))
time <- hms::as_hms(datetime)
pco2_corr <- c(90,135,181,226,272,317,363,NA,454,300)
State_Zero <- c(NA,NA,1,rep(NA,7))
State_Flush <- c(rep(NA,4),1,rep(NA,5))
z <- tibble(datetime, time, pco2_corr, State_Zero, State_Flush)

# now create a new variable
z <- z %>% 
  dplyr::mutate(pco2_corr_qf = ifelse(is.na(pco2_corr), 15,
                               ifelse((State_Zero >= 1 | State_Flush >= 1), 4,
                                      ifelse(pco2_corr < 100 | pco2_corr > 450, 7,
                                             ifelse((time >= "00:00:00" & time <= "01:30:00") | 
                                                      (time >= "12:00:00" & time <= "13:00:00"), 16,
                                                    ifelse((datetime >= "2017-03-10 08:00:00" & 
                                                              datetime < "2017-03-21 20:00:00"), 99,
                                                           1))))))
z
# A tibble: 10 x 6
   datetime            time   pco2_corr State_Zero State_Flush pco2_corr_qf
   <dttm>              <time>     <dbl>      <dbl>       <dbl>        <dbl>
 1 2015-01-26 10:10:00 10:10         90         NA          NA           NA
 2 2015-01-26 10:20:00 10:20        135         NA          NA           NA
 3 2015-01-26 10:30:00 10:30        181          1          NA            4
 4 2015-01-26 10:40:00 10:40        226         NA          NA           NA
 5 2015-01-26 10:50:00 10:50        272         NA           1            4
 6 2015-01-26 11:00:00 11:00        317         NA          NA           NA
 7 2015-01-26 00:10:00 00:10        363         NA          NA           NA
 8 2015-01-26 11:20:00 11:20         NA         NA          NA           15
 9 2015-01-26 11:30:00 11:30        454         NA          NA           NA
10 2017-03-10 10:00:00 10:00        300         NA          NA           NA

前两个 ifelse 工作正常,但接下来的三个却不行。新变量 pco2_corr_qf 不应有任何 NA,但值为 7、16、99 和 1。

我究竟做错了什么?

标签: rdatetimeif-statementdplyr

解决方案


您正在将时间与给出错误输出的字符串进行比较,将其转换为相关类。我们可以使用case_whenwhich 是嵌套的更好替代方案ifelse

library(dplyr)
library(hms)

z %>% 
   mutate(pco2_corr_qf = case_when(
          is.na(pco2_corr) ~ 15,
          State_Zero >= 1 | State_Flush >= 1 ~ 4,
          pco2_corr < 100 | pco2_corr > 450 ~ 7,
          (time >= as_hms("00:00:00") & time <= as_hms("01:30:00")) | 
          (time >= as_hms("12:00:00") & time <= as_hms("13:00:00")) ~ 16,
          datetime >= as.POSIXct("2017-03-10 08:00:00") & 
          datetime < as.POSIXct("2017-03-21 20:00:00") ~ 99,
          TRUE ~ 1))


#   datetime            time   pco2_corr State_Zero State_Flush pco2_corr_qf
#   <dttm>              <time>     <dbl>      <dbl>       <dbl>        <dbl>
# 1 2015-01-26 10:10:00 10:10         90         NA          NA            7
# 2 2015-01-26 10:20:00 10:20        135         NA          NA            1
# 3 2015-01-26 10:30:00 10:30        181          1          NA            4
# 4 2015-01-26 10:40:00 10:40        226         NA          NA            1
# 5 2015-01-26 10:50:00 10:50        272         NA           1            4
# 6 2015-01-26 11:00:00 11:00        317         NA          NA            1
# 7 2015-01-26 00:10:00 00:10        363         NA          NA           16
# 8 2015-01-26 11:20:00 11:20         NA         NA          NA           15
# 9 2015-01-26 11:30:00 11:30        454         NA          NA            7
#10 2017-03-10 10:00:00 10:00        300         NA          NA           99

推荐阅读