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 abroundoff
,然后使用“”on false和true。恐怕我还没有成功:示例生成,这是因为开关
无法接受长度大于1的向量(请尝试读取错误消息)。为了让您的示例工作,您必须循环它,例如,sapply(例如当前$off,函数(x)开关(如字符(x),“FALSE”=“A”,“TRUE”=“B”)
。但是我会选择@Svens尼斯解决方案。谢谢。这是否意味着我不能使用开关(),或者仅仅是我不应该?@DaveRGPswitch
未矢量化,因此您不能将其用于此任务。
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