【问题标题】:Get an uniform distributed sample but keep the order获取均匀分布的样本但保持顺序
【发布时间】:2020-08-24 16:34:45
【问题描述】:

如何获取向量值的样本但保持顺序而不将值本身相互比较?

例如:

V1 contains values (1,2,3,4,5,6,7,8,9,10,11,12,13,14)

我想拿个样品

sample <- (2,7,10,14)

如您所见,这些值仍然按顺序排列,但随机选择。

但如果我在 R 中使用函数 sample 或 rdunif,我会得到随机排序选择:

ie. (7,10,2,14)

谢谢!

【问题讨论】:

    标签: r vector random sample sampling


    【解决方案1】:

    使用以下解决方案,您无需比较原始向量的元素来对它们进行排序;你唯一要做的就是洗牌一个逻辑值向量(TRUEFALSE)。

    假设您想从已排序的向量 v 中选择 n 元素并保持它们的顺序。然后就可以了

    v <- 1:14
    n <- 4
    
    set.seed(42)   # for reproducibility
    logi <- sample(c(rep(TRUE, n), rep(FALSE, length(v) - n)))
    v[logi]
    # [1]  1  6  7 14
    

    EDIT 证明向量v 可以是任何向量,并且我们仍然设法保持其原始顺序。

    set.seed(1)
    n <- 4
    v <- sample(14, replace = FALSE)
    v
    # [1]  9  4  7  1  2 12  3  6 10  8  5 11 13 14
    
    set.seed(42)   # for reproducibility
    logi <- sample(c(rep(TRUE, n), rep(FALSE, length(v) - n)))
    v[logi]
    # [1]  9 12  3 14
    

    这些数字确实尊重向量 v 的原始顺序。

    【讨论】:

    • 如果原始 V1 不是按数字顺序排列的,这也会失败。即使 OP 真的只是想要那个(他为什么要这样做:-)),它也不是通用的解决方案。
    • @CarlWitthoft 我相信你弄错了,原始向量v 不需要按数字顺序排列。请看看我在编辑中的例子,我仍然相信我是正确的
    • @RicS 我很抱歉 - 你是对的。不知何故,当我运行您的解决方案时,我将 v 替换为使用中的原始 v 以外的其他内容。
    • @CarlWitthoft 没问题,感谢您让我仔细检查我的答案
    【解决方案2】:

    让我们看看当原始V1 没有按数字顺序时我们是否不能这样做。

    set.seed(42)
     v <- sample(1:14,14,rep=FALSE)
     #  [1]  1  5 14  9 10  4  2  8 12 11  6 13  7  3
     n <- 4
     foo <- sample(v,length(v)-n,rep=FALSE)
     match(foo,v)
     v[-match(foo,v)]
     # [1]  1 13  7  3
    

    现在输出样本值的顺序与它们在原始向量中的顺序相同。

    【讨论】:

    • 我怀疑这在功能上与 RicS 解决方案相同
    【解决方案3】:
    V1 <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
    sample_V1 <- sample(V1, 4)
    sort(sample_V1)
    

    【讨论】:

    • 谢谢你,但遗憾的是你的建议不起作用,因为我不想比较向量的值来带来顺序,所以解决方案应该独立于值本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2016-11-04
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2016-01-21
    相关资源
    最近更新 更多