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

R-使用具有逻辑值的开关,r,switch-statement,R,Switch Statement,switch()接受作为第一个参数 “将计算结果表示为数字或字符串的表达式。” 但是,是否可以强制它使用逻辑逻辑工具?如果是这样,我是否在代码中犯了其他错误 我在数据框中有一列包含逻辑值,我想根据逻辑参数编写一个新列,其中包含数据框中现有数据的值: exampleCurrent <- data.frame(value = c(5.5, 4.5, 4, 2.9, 2), off = as.logical(c("F", "F", "T", "T

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

“将计算结果表示为数字或字符串的表达式。”

但是,是否可以强制它使用逻辑逻辑工具?如果是这样,我是否在代码中犯了其他错误

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

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))
上面抛出了一个错误,我假设FALSE不是字符,也不是数字或字符:

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

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

您不需要使用
开关来完成此任务。使用
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

tmp我不认为即使您将其转换为字符,您也能够在
开关
@davidernburg中传递
ifelse
语句,这可能是真的,但如果我用一个直接的数值替换
ifelse()
,它仍然不起作用:(看一看@Davidernburg,如果我理解正确,您建议使用as.character abround
off
,然后使用“”on false和true。恐怕我还没有成功:
示例生成,这是因为
开关
无法接受长度大于1的向量(请尝试读取错误消息)。为了让您的示例工作,您必须循环它,例如,
sapply(例如当前$off,函数(x)开关(如字符(x),“FALSE”=“A”,“TRUE”=“B”)
。但是我会选择@Svens尼斯解决方案。谢谢。这是否意味着我不能使用开关(),或者仅仅是我不应该?@DaveRGP
switch
未矢量化,因此您不能将其用于此任务。
Error: unexpected '=' in: switch(exampleCurrent$off, FALSE ="
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