首页 > 解决方案 > ifelse 在向量的每个元素上

问题描述

看着这篇文章,我认为ifelse在某种意义上是矢量化的f(c(x1, x2, x3)) = c(f(x1), f(x2), f(x3))

所以,我想如果z1(下面提供)的代码将为向量的每个元素执行以下操作y

但是,不幸的是它并没有这样做。它为每种情况生成一次,并始终返回那个非常随机的数字。

我到底在哪里做错了?或者,它实际上是 的预期行为ifelse吗?

请注意,如果我将它用作内部的包装函数sapply,我会得到预期的输出z2(从某种意义上说,它不是确定性的,z1因为观察每种情况的出现就足够了),如下所示。

y <- rbinom(n = 20,
            size = 1,
            prob = 0.5)

z1 <- ifelse(test = (y == 1),
             yes = sample(x = c(1, 3, 5, 7, 9),
                          size = 1),
             no = sample(x = c(0, 2, 4, 6, 8),
                         size = 1))

z2 <- sapply(X = y,
             FUN = function(w)
             {
               ifelse(test = (w == 1),
                      yes = sample(x = c(1, 3, 5, 7, 9),
                                   size = 1),
                      no = sample(x = c(0, 2, 4, 6, 8),
                                  size = 1))
             })

data.frame(y, z1, z2)
#>    y z1 z2
#> 1  0  2  2
#> 2  1  1  3
#> 3  1  1  9
#> 4  1  1  7
#> 5  0  2  0
#> 6  0  2  2
#> 7  1  1  7
#> 8  1  1  7
#> 9  0  2  0
#> 10 1  1  5
#> 11 0  2  0
#> 12 0  2  0
#> 13 0  2  6
#> 14 0  2  0
#> 15 0  2  2
#> 16 1  1  7
#> 17 1  1  7
#> 18 0  2  2
#> 19 0  2  2
#> 20 0  2  0

unique(x = z1[y == 1])
#> [1] 1

unique(x = z1[y == 0])
#> [1] 2

reprex 包(v0.2.1)于 2019 年 3 月 13 日创建

任何帮助将不胜感激。

标签: rif-statement

解决方案


ifelse不是一个向量的函数,它是3 个相同长度向量的函数。第一个向量称为test,是一个布尔值,第二个向量yes和第三个向量no给出结果中的元素,根据值逐项选择test

的样本的size = 1大小不同于test(除非 的长度test为 1),因此它将被回收ifelse(参见下面的注释)。相反,从一开始就绘制相同大小的样本test

ifelse(
   test = (y == 1),
   yes = sample(x = c(1, 3, 5, 7, 9), size = length(y), replace = TRUE),
   no = sample(x = c(0, 2, 4, 6, 8), size = lenght(y), replace = TRUE)
)

这些向量实际上不必具有相同的长度。帮助页面?ifelse解释说:“如果yesno太短,它们的元素将被回收。 ”这是您观察到的行为“它为每种情况生成一次,并始终返回那个非常随机的数字。 ”。


推荐阅读