Если ваша цель состоит в том, чтобы получить образец, содержащий некоторые из них на нижнем конце, некоторые около медианы, а некоторые на конце, гораздо легче избежать гирь и просто работать с group_by
+ sample_n
.
library(tidyverse)
df = tibble(my_nums = runif(10,0.1020457,0.1789028))
df %>%
mutate(quantile = case_when(
my_nums <= quantile(my_nums, probs = c(0.33)) ~ "a",
my_nums <= quantile(my_nums, probs = c(0.67)) ~ "b",
TRUE ~ "c"
)) %>%
group_by(quantile) %>%
sample_n(2)
Производит:
my_nums quantile
<dbl> <chr>
1 0.105 a
2 0.105 a
3 0.151 b
4 0.124 b
5 0.173 c
6 0.172 c
Однако, если вы хотите использовать веса, sample_n
требует, чтобы веса были такой же длины, что и вектор, из которого производится выборка, а также что суммавесовые коэффициенты равны 1. Вы можете добавить весовой столбец на основе подразделения ваших групп (как я показываю выше квантилей), сгруппировавшись по нему, сгенерировав случайное число между одним и длиной, разгруппировав, а затем разделив значения в этомстолбец по его сумме. Вот так:
df %>%
mutate(quantile = case_when(
my_nums <= quantile(my_nums, probs = c(0.33)) ~ "a",
my_nums <= quantile(my_nums, probs = c(0.67)) ~ "b",
TRUE ~ "c"
)) %>%
group_by(quantile) %>%
mutate(weight = sample(seq(1,length(my_nums)),length(my_nums))) %>%
ungroup %>% arrange(quantile) %>%
mutate(weight = weight / sum(weight)) %>%
sample_n(6, weight = weight)