使用 cut() 和 group_by()

Mic*_*per 3 r dplyr

我试图将一个连续变量划分为区间,根据观察组改变切割值。之前有一个类似的问题,但它只处理了一个列,而我想找到一个可以推广到他的group_by()函数 in的解决方案dplyr,它允许为分组选择多个列。

这是一个基本的示例数据集:

df <- data.frame(group = c(rep("Group 1", 10),
                           rep("Group 2", 10)),
                 subgroup = c(1,2),
                 value = 1:20)
Run Code Online (Sandbox Code Playgroud)

创建:

     group subgroup value
1  Group 1        1     1
2  Group 1        2     2
3  Group 1        1     3
4  Group 1        2     4
5  Group 1        1     5
6  Group 1        2     6
7  Group 1        1     7
8  Group 1        2     8
9  Group 1        1     9
10 Group 1        2    10
11 Group 2        1    11
12 Group 2        2    12
13 Group 2        1    13
14 Group 2        2    14
15 Group 2        1    15
16 Group 2        2    16
17 Group 2        1    17
18 Group 2        2    18
19 Group 2        1    19
20 Group 2        2    20
Run Code Online (Sandbox Code Playgroud)

出于这个问题的目的,让我们假设我们要将组拆分为1或的值2,具体取决于该值是高于还是低于组的平均值。分组应该由group和完成subgroup,预期输出为:

     group subgroup value cut
1  Group 1        1     1   1
2  Group 1        2     2   1
3  Group 1        1     3   1
4  Group 1        2     4   1
5  Group 1        1     5   1
6  Group 1        2     6   2
7  Group 1        1     7   2
8  Group 1        2     8   2
9  Group 1        1     9   2
10 Group 1        2    10   2
11 Group 2        1    11   1
12 Group 2        2    12   1
13 Group 2        1    13   1
14 Group 2        2    14   1
15 Group 2        1    15   1
16 Group 2        2    16   2
17 Group 2        1    17   2
18 Group 2        2    18   2
19 Group 2        1    19   2
20 Group 2        2    20   2
Run Code Online (Sandbox Code Playgroud)

我希望输出如下:

df %>%
  group_by(group, subgroup) %>%
  # INSERT MAGIC FUNCTION TO BIN DATA
Run Code Online (Sandbox Code Playgroud)

tal*_*lat 6

如果你想使用cut,你可以这样做:

df %>% 
  group_by(group, subgroup) %>% 
  mutate(bin = cut(value, breaks = c(-Inf, mean(value), Inf), labels = c(1,2)))
Run Code Online (Sandbox Code Playgroud)


Jaa*_*aap 5

对于这种情况,您不一定需要cut. 使用:

df %>%
  group_by(group, subgroup) %>%
  mutate(cut_grp = (value > mean(value)) + 1)
Run Code Online (Sandbox Code Playgroud)

给出:

# A tibble: 20 x 4
# Groups:   group, subgroup [4]
   group   subgroup value cut_grp
   <fct>      <dbl> <int>   <dbl>
 1 Group 1       1.     1      1.
 2 Group 1       2.     2      1.
 3 Group 1       1.     3      1.
 4 Group 1       2.     4      1.
 5 Group 1       1.     5      1.
 6 Group 1       2.     6      1.
 7 Group 1       1.     7      2.
 8 Group 1       2.     8      2.
 9 Group 1       1.     9      2.
10 Group 1       2.    10      2.
11 Group 2       1.    11      1.
12 Group 2       2.    12      1.
13 Group 2       1.    13      1.
14 Group 2       2.    14      1.
15 Group 2       1.    15      1.
16 Group 2       2.    16      1.
17 Group 2       1.    17      2.
18 Group 2       2.    18      2.
19 Group 2       1.    19      2.
20 Group 2       2.    20      2.
Run Code Online (Sandbox Code Playgroud)