向量的每个元素上的ifelse

yar*_*ina 0 if-statement r

看看这篇文章,我认为它ifelse是矢量化的f(c(x1, x2, x3)) = c(f(x1), f(x2), f(x3))

因此,我认为z1(下方提供的)代码是否会对vector的每个元素执行以下操作y

  • 测试它是否统一。
    • 如果,请从{1、3、5、7、9}中抽取一个随机数。
    • 如果为NO,则从{0,2,4,6,8}中抽取一个随机数。

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

我到底在哪里做错了?还是实际上是预期的行为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
Run Code Online (Sandbox Code Playgroud)

reprex软件包(v0.2.1)创建于2019-03-13

任何帮助将不胜感激。

Gre*_*gor 6

ifelse不是一个向量的函数,而是三个相同长度的向量的函数。第一个向量称为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)
)
Run Code Online (Sandbox Code Playgroud)

向量实际上不必具有相同的长度。帮助页面?ifelse解释说:“如果yes还是no太短,他们的元素被回收再利用。 ”这是你所观察到的行为,“这一次,生成每个案件,并始终返回非常随机数。 ”。

  • 顺便提一句:我不会说“ size = 1的样本与测试的大小不同,因此它不适用于ifelse”,因为对它使用“ yes”或“ no”是很常见的。一号 应当概述的是,该值会被回收,这就是OP会为每个组获得相同值的原因。 (2认同)
  • 只是为了提升自己,我回答了一个类似的问题(/sf/ask/3746402551/#53520746)引起人们的关注(公平地说),并说明“ ifelse”函数的工作原理。 (2认同)