R: взять 2 случайных неперекрывающихся выборки (для тех же индексов) длины n из вектора длины n, а также

Скажем, у меня есть вектор с именем all_combinations с числами от 1 до 20.

Мне нужно извлечь 2 вектора (coding_1 и coding_2) длины, равной number_of_peptide_clusters, что также равно 20 в моем текущем случае.

Два новых вектора должны быть выбраны случайным образом из all_combinations, чтобы они не перекрывались в каждой позиции индекса.

Я делаю следующее:

set.seed(3)
all_combinations=1:20
number_of_peptide_clusters=20
coding_1 <- sample(all_combinations, number_of_peptide_clusters, replace = FALSE)
coding_1
 [1]  5 12  7  4 10  8 11 15 17 16 18 13  9 20  2 14 19  1  3  6
coding_2 <- sample(all_combinations, number_of_peptide_clusters, replace = FALSE)
coding_2
 [1]  5  9 19 16 18 12  8  6 15  3 13 14  7  2 11 20 10  4 17  1

Это пример, который вызывает у меня проблемы, потому что только одно число перекрывается с одним и тем же индексом (5 в позиции 1).

Что бы я сделал в этих случаях, это определить перекрывающиеся числа и повторно выбрать их из списка всех перекрывающихся чисел...

Представьте, что coding_1 и coding_2 были:

coding_1
 [1]  5 9  7  4 10  8 11 15 17 16 18 13  12 20 2  14 19  1  3  6
coding_2
 [1]  5 9 19 16 18 12  8  6 15  3 13 14  7  2  11 20 10  4 17  1

В этом случае у меня было бы 5 и 9, перекрывающиеся в одной и той же позиции, поэтому я бы передискретизировал их в coding_2 из полного списка перекрывающихся [пересэмплируйте индекс 1 из c(5,9), чтобы он не был равен 5, и индекс 2, чтобы он не равно 9]. Итак, coding_2 будет:

coding_2
 [1]  9 5 19 16 18 12  8  6 15  3 13 14  7  2  11 20 10  4 17  1

Однако в конкретном случае выше я не могу использовать такой подход... Итак, как лучше всего получить 2 выборки длины 20 из вектора длины 20, чтобы выборки не перекрывались одновременно позиции индекса?

Было бы здорово, если бы я мог получить второй образец coding_2, уже зная coding_1... В противном случае получение 2 одновременно также было бы приемлемым, если бы это облегчило задачу. Спасибо!


person DaniCee    schedule 04.11.2020    source источник
comment
Учтите, что длина не всегда равна 20, и хотя coding_1 и coding_2 всегда имеют одинаковую длину, all_combinations может быть равной или большей.   -  person DaniCee    schedule 04.11.2020


Ответы (1)


Я думаю, что лучшее решение — просто использовать стратегию отказа:

set.seed(3)
all_combinations <- 1:20
number_of_peptide_clusters <- 20
count <- 0
repeat {
  count <- count + 1
  message("Try number ", count)
  coding_1 <- sample(all_combinations, number_of_peptide_clusters, replace = FALSE)
  coding_2 <- sample(all_combinations, number_of_peptide_clusters, replace = FALSE)
  if (!any(coding_1 == coding_2))
    break
}
#> Try number 1
#> Try number 2
#> Try number 3
#> Try number 4
#> Try number 5
#> Try number 6
#> Try number 7
#> Try number 8
#> Try number 9
coding_1
#>  [1] 18 16 17 12 13  8  6 15  3  5 20  9 11  4 19  2 14  7  1 10
coding_2
#>  [1]  5 20 14  2 11  6  7 10 19  8  4  1 15  9 13 17 18 16 12  3

Создана 4 ноября 2020 г. в пакете reprex (v0.3.0)

person user2554330    schedule 04.11.2020