让我们看看我能否清楚地解释一下...
假设我有一个向量mtcars$mpg
,如果您做hist(mtcars$mpg)
,则会看到10和15之间有6个值,而15和20之间有12个值,...
我要尝试的是找到mtcars$mpg
的值,以后可以将其用于将数据分为几组,其中每组具有相同数量的数据。
例如,也许10、16和22允许在10和16之间有8个数据,并且在16和22之间也有8个数据。
(我看过SO,但找不到解决此问题的任何问题/答案)
答案 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感到满意,可以使用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