R - 使用带逻辑值的开关

时间:2015-01-14 11:17:21

标签: r switch-statement

switch()接受第一个参数

  

“EXPR表达式,用于评估数字或字符串。”

然而,是否可以强制使用逻辑?如果是这样,我在这段代码中做了别的错吗?

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

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))

选择号码的规则是:

  1. 检查off。如果off为FALSE,请从valueeclMinWork中选择。如果off为TRUE,请从valueeclMinOff
  2. 中选择
  3. 检查extremeValue。如果extreneValue = FALSE,请选择较小的value和步骤1中的字段。如果extremeValue = TRUE,请从步骤1中的字段中选择值。
  4. 我已成功编写了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的尝试也失败了。有没有办法做到这一点,或者我错过了我的代码中的一个根本错误?

1 个答案:

答案 0 :(得分:6)

此任务不需要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