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

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

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

Например:

> 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

В этом случае векторы a и b содержат одинаковое значение с индексом 1 (значение == 4), что неправильно для моих целей.

Есть ли простой способ исправить это?

И можно ли это сделать на шаге subset?

Или я должен пройти цикл проверки элемента за элементом, и еслизначения идентичны, сделайте еще один выбор для b[i] и еще раз проверьте, не совпадает ли он до бесконечности ?

большое спасибо!

Ответы [ 2 ]

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

Моя идея состоит в том, чтобы вместо 2 выборок длины 10 с заменой получить 10 выборок длины 2 без замены

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

Каждый элемент в l представляет собой вектор целых чисел длины два. Эти два целых числа гарантированно будут разными, потому что мы указали replace=FALSE в sample

 # 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)
3 голосов
/ 14 октября 2019

Как насчет двухэтапного процесса отбора проб

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. Поскольку мы делаем это по одной выборке за раз, мы автоматически разрешаем выборку с заменой.

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