#r #dplyr
#r #dplyr
Вопрос:
Я хочу взять df, как показано ниже, и хочу разрезать / bin / group / sample на группы размером = 20. В идеале это «бинирование» происходит случайным образом по идентификаторам, а не последовательно от верхней строки к нижней строке).
Например, идентификаторы 2, 29 и 71 имеют количество 7,7,6 и будут хорошо вписываться в «ячейку» размером = 20. Я хочу достичь минимального количества ячеек и не забочусь о порядке идентификаторов (чем они более случайны, тем лучше).
set.seed(123)
df <- data.frame(
ID = as.numeric(1:100),
Count = as.numeric(sample(1:8, size = 100, replace = T)))
Желаемым результатом будет dataframe / tibble, выглядящий примерно так, как показано ниже, с оптимальной случайной выборкой и минимальным количеством ячеек.
Bin_size= 20 — это установленный мной параметр (идеальным результатом является точное 20 (= 20), но <20 — это нормально, однако>20 — это не нормально). Каждой ячейке должен быть присвоен номер (например, если у меня 10 ячеек, я бы хотел, чтобы они назывались Bin_number 1-10).
ID, Count, Bin_size, Bin_number
Идентификатор 2, 7, 20, 1
Идентификатор 29, 7, 20, 1
Идентификатор 71, 6, 20, 1
и т.д.
Где 7 7 6 = 20 (и т.д.)
Любая помощь в этом была бы весьма признательна. Я задавался вопросом о cumsum и group_by, но не мог понять это.
если вам нужна более подробная информация, я с радостью ее предоставлю. Спасибо!
Комментарии:
1. Не понимаю, как
Bin_size
Bin_number
определяются и.2. Извините за путаницу. Я определяю Bin_size=20 (просто в качестве примера). Я хочу, чтобы количество разных идентификаторов составляло не более и не менее 20 (если возможно). Или, альтернативно, как можно ближе к 20 (но не выше — т. Е. <20 в порядке, но> 20 не в порядке). Bin_number будет просто «именем / номером» соответствующей ячейки. Например, если у меня получится 10 ячеек «размера» 20, они должны быть помечены как 1-10 в столбце Bin_number. Надеюсь, это прояснит
Ответ №1:
BBmisc
Пакет имеет простой (хотя и не оптимизированный) алгоритм упаковки ячеек, который может быть полезен:
library(BBmisc)
library(dplyr)
df %>%
as_tibble() %>%
mutate(bin = binPack(Count, 20),
bin_size = ave(Count, bin, FUN = sum)) %>%
arrange(bin)
# A tibble: 100 x 4
ID Count bin bin_size
<dbl> <dbl> <int> <dbl>
1 11 4 1 20
2 17 8 1 20
3 27 8 1 20
4 22 4 2 20
5 42 8 2 20
6 56 8 2 20
7 34 4 3 20
8 62 8 3 20
9 79 8 3 20
10 40 4 4 20
# ... with 90 more rows
Комментарии:
1. Спасибо! Это отлично работает. Я посмотрел на вспомогательную функцию binPack, чтобы понять, что она делает. упоминается простой жадный алгоритм, не совсем уверен, что это значит. Есть ли способ максимально увеличить «случайность» при сборе розы? Похоже, что сначала это дает мне вариант 4/8/8, затем вариант 7/7/6 и т.д. Мне кажется, что он перебирает параметры, затем берет первые строки / идентификаторы, в которых он видит выполнение критерия; Например, комбинация 4/8/8 выполняется строками 11,17,27, а затем 22,42,56 и т.д. Я хотел бы знать, возможно ли рандомизировать эту выборку.
2. Насколько мне известно, я не использую этот конкретный пакет. Это совсем не моя область, но есть несколько других пакетов, предлагающих решатели упаковки ячеек, которые вы могли бы исследовать, хотя кажется, что цели случайной выборки и минимальные ячейки будут противоречить друг другу.
3. согласовано, случайная выборка и минимальные ячейки будут конфликтовать. Не уверен, как решить проблему простого жадного алгоритма, поскольку он объединяет подсчеты одинакового размера. Еще раз спасибо!
Ответ №2:
Вы хотите что-то вроде этого,
df<-df%>%arrange(Count)%>%mutate(Sum=cumsum(Count),Bin_size=20)
df<-df%>%mutate(Bin_number=cut(Sum,breaks = seq(0,c(max(Sum) 20),20),labels = F,right = T))