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))
选择号码的规则是:
off
。如果off
为FALSE,请从value
或eclMinWork
中选择。如果off
为TRUE,请从value
或eclMinOff
extremeValue
。如果extreneValue
= FALSE,请选择较小的value
和步骤1中的字段。如果extremeValue
= TRUE,请从步骤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.numeric
和as.character
的尝试也失败了。有没有办法做到这一点,或者我错过了我的代码中的一个根本错误?
答案 0 :(得分:6)
此任务不需要switch
。使用ifelse
和pmin
:
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