Как использовать взвешивание в пакете dplyr - PullRequest
0 голосов
/ 11 октября 2019

Я не понимаю, как работает взвешивание в функции dplyr::sample_n. У меня есть список очень маленьких чисел (в диапазоне от 0.1020457 до 0.1789028), и мне нужно взвесить мою выборку так, чтобы я получил немного на нижнем конце, верхнем конце и в середине. Но так как цифры очень похожи, я не уверен, как это сделать. Я также не хочу ограничивать выборку определенным диапазоном (например, числа> 0,16), я просто хочу, чтобы выборки были гораздо более вероятными.

Я могу увеличить диапазон (от -1,552115 до 2,008253). ) но это означает масштабирование по данным, и я не могу взвешивать с отрицательными числами. Я должен делать такие вещи, как пресс (число - максимум). Вот пример того, что я делаю:

sample_n(data.frame(scaledMeasurement$V1), 4, 
         replace = FALSE, 
         weight = abs((scaledMeasurement $V1) - max(scaledMeasurement $V1)))

Вот часть моих данных:

Measurement ID    
0.8022473 1
1.6991193 2
0.7262765 3
0.3903775 4
-1.5521155 5
-0.7821887 6

1 Ответ

0 голосов
/ 11 октября 2019

Если ваша цель состоит в том, чтобы получить образец, содержащий некоторые из них на нижнем конце, некоторые около медианы, а некоторые на конце, гораздо легче избежать гирь и просто работать с 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...