gpt4 book ai didi

r - ifelse 遍历向量的每个元素

转载 作者:行者123 更新时间:2023-12-02 00:21:43 24 4
gpt4 key购买 nike

查看this post ,我认为 ifelsef(c(x1, x2, x3)) = c(f(x1), f(x2), f(x3))< 的意义上是矢量化的.

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

  • 测试是否统一。
    • 如果,则从 {1, 3, 5, 7, 9} 中抽取一个随机数。
    • 如果,则从 {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

reprex package 创建于 2019-03-13 (v0.2.1)

我们将不胜感激。

最佳答案

ifelse 不是一个向量的函数,它是 3 个相同长度的向量 的函数。第一个向量,称为 test,是一个 bool 值,第二个向量 yes 和第三个向量 no 给出结果中的元素,选择项-基于 test 值的 by-item。

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 太短,它们的元素将被回收。”这是您观察到的行为 “它为每个案例生成一次,并始终返回非常随机的数字。”。

关于r - ifelse 遍历向量的每个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55148371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com