Выборка без замены из нескольких векторов разной длины с использованием векторной длины в качестве некоторого веса - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу взять случайные выборки из нескольких векторов разной длины, используя длины векторов в качестве некоторого веса, чтобы больше выборок отбиралось из векторов больших размеров по сравнению с более мелкими (пропорциональная выборка сортов).

Чтобы проиллюстрировать мою точку зрения, пожалуйста, учтите следующее:

# Generating 100 different individuals
vec1 <- rep( letters , length.out = 100 )
vec2 <- c(1:100)

# Join two above vectors
students <- paste( vec1 , vec2 , sep="" )

Выше приведен гигантский вектор из 100 студентов.Сейчас я пытаюсь сгенерировать 10 случайных векторов, из которых должна состояться окончательная выборка.

# Creating 10 vectors of different sizes
a <- split( students , sample(10, 100 , repl = TRUE) )
vec1 <- a$`1`
vec2 <- a$`2`
vec3 <- a$`3`
vec4 <- a$`4`
vec5 <- a$`5`
vec6 <- a$`6`
vec7 <- a$`7`
vec8 <- a$`8`
vec9 <- a$`9`
vec10 <- a$`10`

Итак, теперь у меня есть 10 векторов (vec1 ... vec10) разных размеров.Моя цель состоит в том, чтобы получить окончательный вектор с 50 случайными выборками из всех векторов, так чтобы при выполнении выборки была бы длина вектора, то есть пропорциональная выборка.

Возможно ли что-то подобное?

Извиняюсь, если об этом уже спрашивали!

1 Ответ

0 голосов
/ 15 ноября 2018

Это даст вам приблизительно 50 студентов (в зависимости от того, как a было разделено)

new = unlist(lapply(a, function(x) sample(x, round(length(x)/2))))

Чтобы получить ровно 50 каждый раз, вы можете сделать это

ll = sapply(a, length)   # Get length of each vector in "a"
target = 50
new_ll = 0
while (sum(new_ll) != target)
    new_ll = round(ll * target / sum(ll) + runif(length(ll), -0.5, 0.5))

new = unlist(lapply(1:length(a), function(i) sample(a[[i]], new_ll[i])))

Объяснение: Получить длину каждого вектора в a и присвоить ll.Это равносильно выполнению ll[1] = length(vec1); ll[2] = length(vec2) и так далее.Нам нужно выбрать определенное количество из каждого вектора в a, чтобы мы получили 50 элементов (target).Эта сумма определяется с помощью new_ll.Это примерно равно target / num_students раз каждой длине вектора.

Поскольку это не гарантирует, что каждый раз выбирается target учеников, мы добавляем небольшой джиттер с runif, чтобы немного переместить числа,и мы продолжаем цикл до тех пор, пока сумма new_ll не станет равна target.

Затем последняя строка повторяет i от 1 до 10 (или число векторов в a) и выборкиnew_ll[i] от каждого вектора a[[i]].

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