Выборка из подмножества данных

У меня следующая проблема.

У меня есть несколько подмассивов (скажем, 2), которые я заполнил метками символов (1, 2, 3, 4, 5). Мой алгоритм выбирает метки случайным образом на основе вероятностей появления.

Как я могу заставить R вместо этого выбирать метки 1: 3 для подмассива 1 и 4: 5 для подмассива 2, скажем, без использования подмножества (т. Е. []). То есть я хочу, чтобы для каждого подмассива выбиралось случайное подмножество меток, а не все метки, назначенные каждому подмассиву вручную с помощью [].

Я знаю, что sample() должен помочь.

Используя подмножество (чего я не хочу), можно было бы сделать

x <- 1:5

sample(x[1:3], size, prob = probs[1:3])

но это присваивает метки 1:3 ВСЕМ подмассивам.

Бы

sample(sample(x), size, replace = TRUE, prob = probs)

Работа?

Любые идеи? Пожалуйста, дайте мне знать, если это неясно.

Вот небольшой пример, который выбирает метки 1:5 для каждого из 10 подмассивов.

set.seed(1)

N <- 10
K <- 2
Hstar <- 5
probs <- rep(1/Hstar, Hstar)
perms <- 5

## Set up container(s) to hold the identity of each individual from each permutation ##

num.specs <- ceiling(N / K)

## Create an ID for each haplotype ##

haps <- 1:Hstar

## Assign individuals (N) to each subpopulation (K) ##

specs <- 1:num.specs

## Generate permutations, assume each permutation has N individuals, and sample those individuals' haplotypes from the probabilities ##

gen.perms <- function() {
    sample(haps, size = num.specs, replace = TRUE, prob = probs) # I would like each subarray to contain a random subset of 1:5.
}

pop <- array(dim = c(perms, num.specs, K))

for (i in 1:K) {
    pop[,, i] <- replicate(perms, gen.perms())
}
pop

Надеюсь, это поможет.


person compbiostats    schedule 09.01.2018    source источник
comment
Образец работает только на одном объекте одновременно. Если вам нужна более продвинутая выборка, вам придется создать функцию. В чем причина нежелания использовать подмножество? Если бы подмножество было игрой, вы могли бы сделать sample(c(x[1:3], y[4:5]), ...).   -  person Roman Luštrik    schedule 09.01.2018
comment
Не могли бы вы привести пример массивов и ожидаемого результата?   -  person missuse    schedule 09.01.2018
comment
@RomanLuštrik У меня есть несколько подмассивов от 2 до 100, поэтому такое подмножество было бы довольно неэффективным.   -  person compbiostats    schedule 09.01.2018
comment
@missuse я разместил пример   -  person compbiostats    schedule 09.01.2018
comment
Не могли бы вы убедиться, что это воспроизводимый пример?   -  person CPak    schedule 09.01.2018
comment
@CPak Я опубликовал обновленный пример.   -  person compbiostats    schedule 09.01.2018


Ответы (2)


Я думаю, что вы на самом деле хотите что-то вроде этого

num.specs <- 3
haps[sample(seq(haps),size = num.specs,replace = F)]
[1] 3 5 4

Это случайное подмножество вашего вектора?

person denis    schedule 09.01.2018

Не совсем то, что вы хотите (возвращает список матриц вместо трехмерного массива), но это может помочь

lapply(split(1:5, cut(1:5, breaks=c(0, 2, 5))), function(i) matrix(sample(i, 25, replace=TRUE), ncol=5))

Используйте cut и split для разделения вектора меток символов перед их выборкой. Здесь я разделяю ваши метки символов по значению 2. Кроме того, вместо выборки 5 чисел 5 раз вы можете выбрать 25 чисел один раз и преобразовать в матрицу.

person CPak    schedule 09.01.2018
comment
Почти то, что мне нужно. Но я хотел бы разделить на произвольное число (поэтому мне не нужно указывать его каждый раз). Есть ли более чистый способ сделать это с типом массива? - person compbiostats; 10.01.2018
comment
Как я могу разбить его на более чем 2 подмассива? Я не вижу никаких аргументов, указывающих на это. - person compbiostats; 10.01.2018
comment
Например, вы можете указать разрывы как breaks=c(0, 2, 4, 5). Попробуйте. - person CPak; 10.01.2018