R - 使用具有逻辑值的开关
R - Using switch with logical values
switch()
接受作为第一个参数
"EXPR an expression evaluating to a number or a character string."
但是,可以强制使用逻辑吗?如果是这样,我是否在这段代码中做错了什么?
我在数据框中有一列包含逻辑值,我想根据逻辑参数写入一个包含数据框中现有数据值的新列:
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))
select输入号码的规则是:
- 勾选
off
。如果 off
为 FALSE,则 value
或 eclMinWork
中的 select。如果 off
为真,select 来自 value
或 eclMinOff
- 勾选
extremeValue
。如果 extreneValue
= FALSE,select value
和步骤 1 中的字段中的较小者。如果 extremeValue
= TRUE,select 来自步骤中字段的值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
和 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
switch()
接受作为第一个参数
"EXPR an expression evaluating to a number or a character string."
但是,可以强制使用逻辑吗?如果是这样,我是否在这段代码中做错了什么?
我在数据框中有一列包含逻辑值,我想根据逻辑参数写入一个包含数据框中现有数据值的新列:
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))
select输入号码的规则是:
- 勾选
off
。如果off
为 FALSE,则value
或eclMinWork
中的 select。如果off
为真,select 来自value
或eclMinOff
- 勾选
extremeValue
。如果extreneValue
= FALSE,selectvalue
和步骤 1 中的字段中的较小者。如果extremeValue
= TRUE,select 来自步骤中字段的值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
和 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