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
为假,从value
或eclMinWork
中选择。如果off
为真,则从value
或eclMinOff
中选择。 - 检查
extremeValue
。如果extremeValue
为假,则选择步骤1中较小的数字。如果extremeValue
为真,则选择步骤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
来包装变量,但也失败了。有没有方法可以做到这一点,还是我在代码中缺少了一个基本错误?
switch
语句中传递一个ifelse
语句。 - David Arenburgifelse()
,它仍然不起作用 :( - DaveRGPexampleGenerated <- cbind(exampleCurrent, bestCase = switch(as.character(exampleCurrent$off), "FALSE" = "A", "TRUE" = "B"))
- DaveRGPswitch
不能接受长度大于1的向量(尝试阅读错误信息)。为了使你的示例正常工作,你需要循环它,即sapply(exampleCurrent$off, function(x) switch(as.character(x), "FALSE" = "A", "TRUE" = "B"))
。但我会选择 @Svens 的好方法。 - David Arenburg