R 如何使用fct#u lump()按组获取前n个级别,并将其余级别放入';其他';?
我试图根据一个聚合变量在每个组中找到前3个因子水平,并将其余因子水平分组为每个组的“其他”。通常我会使用fct_rup_n来实现这一点,但我不知道如何使它在每个小组中都起作用。 下面是一个例子,我想根据x变量分组,根据z值对y变量排序,选择前3个y变量,然后将y的其余部分分组为“其他”: 其中返回以下内容:R 如何使用fct#u lump()按组获取前n个级别,并将其余级别放入';其他';?,r,dplyr,plyr,r-factor,R,Dplyr,Plyr,R Factor,我试图根据一个聚合变量在每个组中找到前3个因子水平,并将其余因子水平分组为每个组的“其他”。通常我会使用fct_rup_n来实现这一点,但我不知道如何使它在每个小组中都起作用。 下面是一个例子,我想根据x变量分组,根据z值对y变量排序,选择前3个y变量,然后将y的其余部分分组为“其他”: 其中返回以下内容: # A tibble: 9 x 3 # Groups: x [3] x y z <fct> <fct> <int> 1
# A tibble: 9 x 3
# Groups: x [3]
x y z
<fct> <fct> <int>
1 r i 95
2 r c 92
3 r a 88
4 s g 94
5 s g 92
6 s f 92
7 t j 100
8 t d 93
9 t i 81
#一个tible:9 x 3
#组别:x[3]
x y z
1 r i 95
2 r c 92
3 r a 88
4 s g 94
5 s g 92
6 s f 92
7T j 100
8 t d 93
9 t i 81
这基本上就是我想要的,但是我缺少了r、s和t中的'other'变量,它收集了未计算的z值
我可以用fct\u lump\n来做这个吗?或者将排除的变量分组为“其他”在R4.0.0和
tidyverse
1.3.0中尝试过:
set.seed(50)
df <- tibble(x = factor(sample(letters[18:20], 100, replace = T)),
y = factor(sample(letters[1:10], 100, replace = T)),
z = sample(100, 100, replace = T))
df %>%
group_by(x) %>%
arrange(desc(z)) %>%
mutate(a = row_number(-z)) %>%
mutate(y = case_when(a > 3 ~ "Other", TRUE ~ as.character(y))) %>%
mutate(a = case_when(a > 3 ~ "Other", TRUE ~ as.character(a))) %>%
group_by(x, y, a) %>%
summarize(z = sum(z)) %>%
arrange(x, a) %>%
select(-a)
set.seed(50)
df%
分组依据(x)%>%
排列(描述(z))%>%
变异(a=行数(-z))%>%
变异(当(a>3~“其他”,真~如字符(y)))%>%
变异(a=case_,当(a>3~“其他”,TRUE~as.character(a)))%>%
(x,y,a)%>%
汇总(z=总和(z))%>%
排列(x,a)%>%
选择(-a)
输出:
# A tibble: 12 x 3
# Groups: x, y [11]
x y z
<fct> <chr> <int>
1 r b 92
2 r j 89
3 r g 83
4 r Other 749
5 s i 93
6 s h 93
7 s i 84
8 s Other 1583
9 t a 99
10 t b 98
11 t i 95
12 t Other 1508
#一个tible:12 x 3
#组:x,y[11]
x y z
1 r b 92
2 r j 89
3 r g 83
4 r其他749
5 s i 93
6 s h 93
7 s i 84
8其他1583
9吨a 99
10TB98
11 t i 95
12吨其他1508
注:变量a
与y
一起使用是为了补偿y被替换采样的事实(参见输出的第5行和第7行)。如果不使用a
,则输出的第5行和第7行将对其z
进行汇总。还请注意,我试图解决所提出的问题,但我将y
保留为字符,因为我假设那些“其他”并不意味着是同一个因子级别
set.seed(50)
df <- tibble(x = factor(sample(letters[18:20], 100, replace = T)),
y = factor(sample(letters[1:10], 100, replace = T)),
z = sample(100, 100, replace = T))
df %>%
group_by(x) %>%
arrange(desc(z)) %>%
mutate(a = row_number(-z)) %>%
mutate(y = case_when(a > 3 ~ "Other", TRUE ~ as.character(y))) %>%
mutate(a = case_when(a > 3 ~ "Other", TRUE ~ as.character(a))) %>%
group_by(x, y, a) %>%
summarize(z = sum(z)) %>%
arrange(x, a) %>%
select(-a)
# A tibble: 12 x 3
# Groups: x, y [11]
x y z
<fct> <chr> <int>
1 r b 92
2 r j 89
3 r g 83
4 r Other 749
5 s i 93
6 s h 93
7 s i 84
8 s Other 1583
9 t a 99
10 t b 98
11 t i 95
12 t Other 1508