138

我发现 R 的 ifelse 语句有时非常方便。例如:

ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2

但是我对以下行为感到有些困惑。

ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3

这是一个高于我工资等级的设计选择吗?

4

9 回答 9

111

状态的文档ifelse

ifelsetest返回一个与填充有相同形状的值,这些元素是从yes或 中选择no的元素,取决于元素testTRUE还是FALSE

由于您通过长度为 1 的测试值,因此您将获得长度为 1 的结果。如果您通过更长的测试向量,您将获得更长的结果:

> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4

Soifelse旨在用于测试布尔向量并返回相同长度的向量的特定目的,其中填充了从 (vector)yesno参数中获取的元素。

由于函数的名称,这是一个常见的混淆,当你真正想要一个普通的if () {} else {}构造时使用它。

于 2009-08-26T16:13:52.323 回答
75

我打赌你想要一个简单的if语句而不是ifelse- 在 R 中,if它不仅仅是一个控制流结构,它可以返回一个值:

> if(TRUE) c(1,2) else c(3,4)
[1] 1 2
> if(FALSE) c(1,2) else c(3,4)
[1] 3 4
于 2009-11-18T17:27:59.840 回答
15

请注意,如果您将结果分配在以下内容中,则可以规避该问题ifelse

ifelse(TRUE, a <- c(1,2), a <- c(3,4))
a
# [1] 1 2

ifelse(FALSE, a <- c(1,2), a <- c(3,4))
a
# [1] 3 4
于 2018-04-06T15:03:55.090 回答
11

使用`if`,例如

> `if`(T,1:3,2:4)
[1] 1 2 3
于 2019-07-06T16:45:13.227 回答
9

是的,我认为 ifelse() 真的是为当你有一个很大的测试向量并且想要将每个测试映射到两个选项之一时设计的。例如,我经常以这种方式为 plot() 做颜色:

plot(x,y, col = ifelse(x>2,  'red', 'blue'))

如果您有一个很长的测试向量但想要输出对,您可以使用sapply()or plyr'sllply()或其他东西,也许。

于 2009-08-28T20:30:22.187 回答
4

有时用户只需要一个switch语句而不是一个ifelse. 在这种情况下:

condition <- TRUE
switch(2-condition, c(1, 2), c(3, 4))
#### [1] 1 2

(这是肯威廉姆斯答案的另一个语法选项)

于 2017-07-07T21:13:33.557 回答
4

这是一种类似于 Cath 建议的方法,但它可以与现有的预分配向量一起使用

它是基于使用get()类似的:

a <- c(1,2)
b <- c(3,4)
get(ifelse(TRUE, "a", "b"))
# [1] 1 2
于 2018-07-25T20:50:08.830 回答
2

在您的情况下,使用if_elsefromdplyr会有所帮助:if_else比 更严格ifelse,并为您的情况引发错误:

library(dplyr)
if_else(TRUE,c(1,2),c(3,4))
#> `true` must be length 1 (length of `condition`), not 2
于 2019-05-20T17:21:28.613 回答
0

everydropr上找到:

ifelse(rep(TRUE, length(c(1,2))), c(1,2),c(3,4))
#>[1] 1 2

可以复制您的条件的结果以返回所需的长度

于 2020-07-15T02:34:07.663 回答