Случайная выборка булева вектора - PullRequest
2 голосов
/ 12 октября 2011

У меня есть входной вектор vi с логическими значениями.Я хочу взять случайную выборку размером n из вектора, где значение равно true, поэтому конечный вектор vf имеет эти свойства

  1. Длина векторов равнаlength(vf) == length(v0)

  2. vf имеет n истинные значения n==sum(vf)

  3. Истинные значения в vf не могут превышатьзначения в v0 n <= sum (v0) </p>

  4. Все истинные значения в vf также верны в vi

Векторы представляют выборку строк во фрейме данных, и это реализует стратифицированную выборку.До сих пор я выяснил, как использовать which() для получения номеров строк, использовать sample() для получения случайной выборки, но последняя часть воссоздает логический вектор.Есть, наверное, более элегантный способ?

Например:

n <- 1

v0 <- c(T,T,F,F)

vf <- c(T,F,F,F)

Ответы [ 2 ]

4 голосов
/ 12 октября 2011

Вот одно из решений:

# Make up some vector v0 and choose n
v0 <- rep(c(F,T,F), 5)
n <- 3


# The actual code
x <- which(v0)
vf <- logical(length(v0))
vf[x[sample.int(length(x), n)]] <- TRUE


# Finally validate the result
identical(length(vf), length(v0)) # TRUE
all(v0[vf])  # TRUE
sum(vf) == n # TRUE
1 голос
/ 12 октября 2011

Вы существенно изменили требования.Мое новое предложение работает путем случайного выбора правильного числа ИСТИНА-индексов, чтобы установить ЛОЖЬ:

vf <- vi; vf[sample( which(vi), size=sum(vi)-n)] <- FALSE

# Console
> vi <- sample(c(TRUE,FALSE),size=20, replace=TRUE, prob=c(0.9, 0.1) )
> vf <- vi; vf[sample( which(vi), size=sum(vi)-10)] <- FALSE
> sum(vf)
[1] 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...