查找向量的值以将数据分为几组,每组中的数据数相同

时间:2019-06-24 12:46:43

标签: r

让我们看看我能否清楚地解释一下... 假设我有一个向量mtcars$mpg,如果您做hist(mtcars$mpg),则会看到10和15之间有6个值,而15和20之间有12个值,...

我要尝试的是找到mtcars$mpg的值,以后可以将其用于将数据分为几组,其中每组具有相同数量的数据。
例如,也许10、16和22允许在10和16之间有8个数据,并且在16和22之间也有8个数据。

(我看过SO,但找不到解决此问题的任何问题/答案)

1 个答案:

答案 0 :(得分:0)

由于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感到满意,可以使用ntileleft_joinsummarise

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