【问题标题】:R: make 2 subset vectors so that values are different index-wiseR:制作2个子集向量,以便值在索引方面不同
【发布时间】:2020-02-10 16:36:41
【问题描述】:

我想用 replace=TRUE 从相同的数据中创建 2 个向量子集。

即使两个向量可以包含相同的值,它们在相同的索引位置也不能相同。

例如:

> set.seed(1)
> a <- sample(15, 10, replace=T)
> b <- sample(15, 10, replace=T)
> a
 [1]  4  6  9 14  4 14 15 10 10  1
> b
 [1]  4  3 11  6 12  8 11 15  6 12
> a==b
 [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

在这种情况下,向量 ab 在索引 1 (value==4) 处包含相同的值,这对我的目的来说是错误的。

有没有简单的方法来纠正这个问题?

可以在subset 步骤上完成吗?

或者我应该逐个元素地检查循环,如果值相同,请为b[i] 再次选择并再次检查它是否不相同无限

非常感谢!

【问题讨论】:

    标签: r vector indexing subset element


    【解决方案1】:

    我的想法是,不要得到 2 个长度为 10 的样本进行替换,而是获取 10 个长度为 2 的样本而不进行替换

     library(purrr)
     l <- rerun(10,sample(15,2,replace=FALSE))
    

    l 中的每个元素都是长度为 2 的整数向量。这两个整数保证是不同的,因为我们在sample 中指定了replace=FALSE

     # from l extract all first element in each element, this is a
     a <- map_int(l,`[[`,1)
     # from list extract all second elements, this is b
     b <- map_int(l,`[[`,2)
    

    【讨论】:

    • 这真是太聪明了。 split(replicate(10, sample(15,2)), seq(2)) 将是类似方法的基本 R 复制。
    • @fmarm 哦,是的,这确实很聪明。应该比我的方法快得多。非常整洁! (+1)
    • 我喜欢这个主意,但我有一个问题……可以用replace=TRUE 来做吗?就像a 中的所有值一样,b 中的所有值也应该不同?我可能需要那个选项
    • @DaniCee 如果你需要所有不同的值,它实际上更容易,例如 v &lt;- sample(25,20,replace=TRUE) 这样你就得到一个有 20 个不同值的向量,然后将它切成两块 a &lt;- v[1:10] ; b &lt;- v[11:20]
    • @fmarm 对不起,我很困惑,我想说replace=FALSE
    【解决方案2】:

    两阶段抽样过程怎么样

    set.seed(1)
    x <- 1:15
    a <- sample(x, 10, replace = TRUE)
    b <- sapply(a, function(v) sample(x[x != v], 1))
    a != b
    #[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
    

    我们先抽取样本a;然后对于来自a 的每个样本,我们从x 的值集合中抽取一个新样本不包括来自a 的当前样本。由于我们一次只做一个样本,因此我们会自动允许替换抽样。

    【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2019-11-07
    • 1970-01-01
    • 2016-06-12
    • 2016-04-29
    • 2017-03-18
    相关资源
    最近更新 更多