найти значения вектора для разделения данных на группы с одинаковым количеством данных в каждой группе - PullRequest
0 голосов
/ 24 июня 2019

Посмотрим, смогу ли я объяснить это ясно ... Скажем, у меня есть вектор mtcars$mpg, если вы сделаете hist(mtcars$mpg), вы увидите, что есть 6 значений между 10 и 15, 12 между 15 и 20, ...

Я пытаюсь найти значения mtcars$mpg, которые позже я смогу использовать для разделения данных на группы, где каждая группа имеет одинаковое количество данных.
Например, возможно, 10, 16 и 22 позволяют иметь 8 данных между 10 и 16, а также 8 данных между 16 и 22.

(Я посмотрел на SO, но не могу найти вопросы / ответы, которые касаются этого)

1 Ответ

0 голосов
/ 24 июня 2019

Поскольку mpg является непрерывной переменной, вы можете произвольно сгруппировать данные, отсортировав фрейм данных по его значениям, а затем просто добавив переменную группировки с помощью rep(x, each = n).Например, используя базы R и n <- 8 для групп по 8:

df <- mtcars[order(mtcars$mpg),]
df$group <- rep(1:(nrow(df) / n), each = n)

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

cutoffs <- aggregate(df$mpg, list(group = df$group), `[`, 1)
merge(df, cutoffs, by = "group")

#### OUTPUT ####

   group  mpg cyl  disp  hp drat    wt  qsec vs am gear carb    x
1      1 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4 10.4
2      1 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4 10.4
3      1 13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4 10.4
4      1 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4 10.4
5      1 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4 10.4
6      1 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8 10.4
7      1 15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3 10.4
8      1 15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2 10.4
9      2 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2 15.5
10     2 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4 15.5
11     ...

Если вы чувствуете себя комфортно с dplyr, вы можете использовать ntile, left_join и summarise:

library(dplyr)

mutate(mtcars, group = ntile(mpg, 4)) %>% 
    group_by(group) %>% 
    left_join(summarise(., cutoff = first(mpg, order_by = mpg)), by = "group") %>% 
    arrange(mpg)

#### OUTPUT ####

# A tibble: 32 x 13
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb group cutoff
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>  <dbl>
 1  10.4     8  472    205  2.93  5.25  18.0     0     0     3     4     1   10.4
 2  10.4     8  460    215  3     5.42  17.8     0     0     3     4     1   10.4
 3  13.3     8  350    245  3.73  3.84  15.4     0     0     3     4     1   10.4
 4  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4     1   10.4
 5  14.7     8  440    230  3.23  5.34  17.4     0     0     3     4     1   10.4
 6  15       8  301    335  3.54  3.57  14.6     0     1     5     8     1   10.4
 7  15.2     8  276.   180  3.07  3.78  18       0     0     3     3     1   10.4
 8  15.2     8  304    150  3.15  3.44  17.3     0     0     3     2     1   10.4
 9  15.5     8  318    150  2.76  3.52  16.9     0     0     3     2     2   15.5
10  15.8     8  351    264  4.22  3.17  14.5     0     1     5     4     2   15.5
# … with 22 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...