当向量长度为​​1时,R中的sample()不可预测

时间:2018-01-29 16:36:19

标签: r random sample

我正在尝试调试一个简短的程序,在某些条件下,从矢量元素的采样结束时,我得到一个令人不安的结果。它发生在向量的元素中,它们仍然被绘制为单个值。

在特定情况下,我指的是向量被称为remaining并且包含单个元素,数字2。我希望这个向量中任何大小为1的样本都会固执地返回2,因为2是向量中唯一的元素,但事实并非如此:

Browse[2]> is.vector(remaining)
[1] TRUE
Browse[2]> sample(remaining,1)
[1] 2
Browse[2]> sample(remaining,1)
[1] 2
Browse[2]> sample(remaining,1)
[1] 1
Browse[2]> sample(x=remaining, size=1)
[1] 1
Browse[2]> sample(x=remaining, size=1)
[1] 2
Browse[2]> sample(x=remaining, size=1)
[1] 1
Browse[2]> sample(x=remaining, size=1)
[1] 1
Browse[2]> sample(x=remaining, size=1)
[1] 1

如您所见,有时返回的是1,有些则是2

我对函数sample()误解了什么?

1 个答案:

答案 0 :(得分:4)

来自remaining = 2

  

如果x的长度为1,则为数字(在is.numeric意义上),x> = 1,   样品取样发生在1:x。

因此,如果您有sample(remaining),则sample(x = 1:2)相当于library(microbenchmark) # if remaining is of length one remaining <- 2 microbenchmark(a = {if ( length(remaining) > 1 ) { sample(remaining) } else { remaining }}, b = ifelse(length(remaining) > 1, sample(remaining), remaining), c = remaining[sample(length(remaining))]) Unit: nanoseconds expr min lq mean median uq max neval cld a 349 489 625.12 628.0 663.5 3283 100 a b 1536 1886 2240.58 2025.0 2165.5 13898 100 b c 4051 4400 5193.41 4679.5 5064.0 38413 100 c # If remaining is not of length one remaining <- 1:10 microbenchmark(a = {if ( length(remaining) > 1 ) { sample(remaining) } else { remaining }}, b = ifelse(length(remaining) > 1, sample(remaining), remaining), c = remaining[sample(length(remaining))]) Unit: microseconds expr min lq mean median uq max neval cld a 5.238 5.7970 6.82703 6.251 6.9145 51.264 100 a b 11.663 12.2920 13.14831 12.851 13.3745 34.851 100 b c 5.238 5.9715 6.57140 6.426 6.8450 14.667 100 a

更新

从评论中可以清楚地看到,您也在寻找解决此问题的方法。以下是三个提到的替代方案的基准比较:

sample()

如果在remaining长度为&gt;时if() {} else {}被更频繁地调用,则joran的建议可能是最快的。 1,defmodule TestQuery do def build_query() do Enum.map(["test1", "test2", "hello"], fn item -> query(item) end) end def query(item) do case String.contains? item, "test" do true -> item false -> nil end end end 方法会更快。