r - ifelse 在向量的每个元素上
问题描述
看着这篇文章,我认为ifelse
在某种意义上是矢量化的f(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 包(v0.2.1)于 2019 年 3 月 13 日创建
任何帮助将不胜感激。
解决方案
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
解释说:“如果yes
或no
太短,它们的元素将被回收。 ”这是您观察到的行为“它为每种情况生成一次,并始终返回那个非常随机的数字。 ”。
推荐阅读
- excel - 从 A 列 Excel 数组公式中查找 C 列中最接近的值
- python - 仅打开和读取目录内的目录文件
- c++ - Openssl 二进制文件没有 lib 文件或包含 Qt 的头文件
- jquery - 通过模态传递 data-id 到 jQuery 验证
- javascript - Get Data from Array Without Quotes
- mysql - Append if not exists mysql json field
- ios - 为什么 Core Data 加载两个持久存储?
- c++ - 在 C++ 中从键盘创建 N 个链表,即 N 个数字
- mysql - 排序后的 json 数组字段
- heroku - 烧瓶和heroku的访问问题