R: сделать 2 вектора поднабора так, чтобы значения были разными по индексу, а также разными по каждому вектору - PullRequest
0 голосов
/ 14 октября 2019

В ответ на этот вопрос я хочу сделать нечто подобное, но на этот раз у меня есть еще одно требование.

Я хочу сделать подмножество 2 векторов из одних и тех же данных.

Мне нужно, чтобы replace было установлено на FALSE, потому что мне нужно, чтобы все значения были разными для a, и все значения должны быть разными для b.

Кроме этогозначения не могут быть одинаковыми в a и b для одной и той же позиции индекса.

Обратите внимание, что вектор выборки v всегда фиксирован, как и длина выборки l.

Делая следующее, я выполняю только один критерий (значения по a и значения по b различны, но все же значения в одном и том же индексе между a и b могут быть идентичными)

> 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

Делая следующее (ответ из предыдущего вопроса ), я выполняю только другой критерий (значения в одном и том же индексе не идентичны, но могут быть одинаковые значения в a или b).

> 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

Любая помощь попробуйтеРазрушить оба подхода? Спасибо!

1 Ответ

0 голосов
/ 14 октября 2019

Отредактировано с помощью цикла 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
...