【问题标题】:R: make 2 subset vectors so that values are different index-wise, and also different across each vectorR:制作2个子集向量,以便值在索引方面不同,并且每个向量也不同
【发布时间】:2020-02-11 00:44:51
【问题描述】:

跟进this question,我想做类似的事情,但这次我还有一个要求。

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

我需要将replace 设置为FALSE,因为我需要a 中的所有值都不同,并且b 中的所有值都不同。

除此之外,同一索引位置的ab 中的值不能相同。

请注意,采样向量 v 始终是固定的,样本长度 l 也是如此。

执行以下操作,我只满足一个标准(a 中的值和 b 中的值不同,但 ab 之间的同一索引中的值仍然可以相同)

> set.seed(1)
> v <- 1:15
> l <- 10
> a <- sample(v, l, replace=F)
> b <- sample(v, l, replace=F)
> a
 [1]  4  6  8 11  3  9 10 14  5  1
> b
 [1]  4  3  9  5 13 12  7  8 14 10
> a==b
 [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

执行以下操作(来自previous question 的答案),我只满足其他标准(同一索引中的值不相同,但ab 中的值可以相同)。

> ab <- split(replicate(10, sample(15,2)), seq(2))
> a <- ab[[1]]
> b <- ab[[2]]
> a
 [1] 14  7 10  8  2  6  6  8 13 12
> b
 [1]  5  5  4 11 13 12  5 13  6 14
> duplicated(a)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE
> duplicated(b)
 [1] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE

尝试折叠这两种方法有什么帮助吗?谢谢!

【问题讨论】:

    标签: r indexing subset element


    【解决方案1】:

    使用while 循环编辑以进行重新采样,直到正确(没有重复)。

    知道了...我所做的是检查b 中的哪些值等于a 对于同一索引,哪些不相等。

    对于那些相等的,我从等于v 但没有b 中已经“接受”的值(对于同一索引不等于a)的向量重新采样。

    像这样:

    > set.seed(6)
    > v <- 1:15
    > l <- 10
    > a <- sample(v, l, replace=F)
    > b <- sample(v, l, replace=F)
    > a
     [1] 10 14  4  5  9 15 11  7 13  1
    > b
     [1] 10 13  2  4  9  3  5  6 14 11
    > a==b
     [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
    
    
    > if (any(a==b)==TRUE) {
    +   b0 <- b[which(a==b)]
    +   b2 <- b[which(a!=b)]
    +   vnew <- v[which(!(v %in% b2))]
    +   b0 <- sapply(b0, function(x) sample(vnew[vnew != x], 1))
    +   while (any(duplicated(b0))==TRUE){
    +     b0 <- sapply(b0, function(x) sample(vnew[vnew != x], 1))
    +   }
    +   b[which(a==b)] <- b0
    + }
    
    
    > a
     [1] 10 14  4  5  9 15 11  7 13  1
    > b
     [1] 15 13  2  4 12  3  5  6 14 11
    > a==b
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    > duplicated(b)
     [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
    

    【讨论】:

    • 还没有,因为新的b0 值可能相同...
    • 用 while 循环编辑以进行重新采样,直到正确(没有重复)
    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 2018-05-05
    • 2019-11-07
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多