R - 使用具有逻辑值的开关

R - Using switch with logical values

switch() 接受作为第一个参数

"EXPR an expression evaluating to a number or a character string."

但是,可以强制使用逻辑吗?如果是这样,我是否在这段代码中做错了什么?

我在数据框中有一列包含逻辑值,我想根据逻辑参数写入一个包含数据框中现有数据值的新列:

exampleCurrent <- data.frame(value = c(5.5, 4.5, 4, 2.9, 2),
                         off = as.logical(c("F", "F", "T", "T", "F")),
                         extremeValue = as.logical(c("F", "F", "F", "F", "T")),
                         eclMinWork = c(5, 5.3, 5, 4.7, 3),
                         eclMinOff = c(4, 3.2, 3, 4, 3))

我想讲这个:

exampleWanted <- data.frame(value = c(5.5, 4.5, 4, 2.9, 2),
                        off = as.logical(c("F", "F", "T", "T", "F")),
                        extremeValue = as.logical(c("F", "F", "F", "F", "T")),
                        eclMinWork = c(5, 5.3, 5, 4.7, 4),
                        eclMinOff = c(4, 3.2, 3, 4, 3),
                        output = c(5, 4.5, 3, 2.9, 3))

select输入号码的规则是:

  1. 勾选off。如果 off 为 FALSE,则 valueeclMinWork 中的 select。如果 off 为真,select 来自 valueeclMinOff
  2. 勾选extremeValue。如果 extreneValue = FALSE,select value 和步骤 1 中的字段中的较小者。如果 extremeValue = TRUE,select 来自步骤中字段的值1.

我已经成功地编写了一个可以执行的 ifelse(),尽管我想知道我是否可以使用 switch 来代替。

exampleGenerated <- cbind(exampleCurrent, bestCase =
                          switch(exampleCurrent$off,
                                 FALSE = ifelse(exampleCurrent$value<exampleCurrent$eclMinWork,exampleCurrent$value, exampleCurrent$eclMinWork),
                                 TRUE = ifelse(exampleCurrent$value<exampleCurrent$eclMinOff,exampleCurrent$value, exampleCurrent$eclMinOff)))

以上会引发错误,我假设 FALSE 不是字符,并且(从表面上看)不是数字或字符:

Error: unexpected '=' in: switch(exampleCurrent$off, FALSE ="

但是,我尝试将 as.numericas.character 包装在变量周围的尝试也失败了。有没有办法做到这一点,或者我是否遗漏了我的代码中的一个基本错误?

您不需要 switch 完成此任务。使用 ifelsepmin 更容易:

tmp <- with(exampleCurrent, ifelse(off, eclMinOff, eclMinWork))
transform(exampleCurrent, 
          bestCase = ifelse(extremeValue, tmp, pmin(value, tmp)))

#   value   off extremeValue eclMinWork eclMinOff bestCase
# 1   5.5 FALSE        FALSE        5.0       4.0      5.0
# 2   4.5 FALSE        FALSE        5.3       3.2      4.5
# 3   4.0  TRUE        FALSE        5.0       3.0      3.0
# 4   2.9  TRUE        FALSE        4.7       4.0      2.9
# 5   2.0 FALSE         TRUE        3.0       3.0      3.0