Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使用fct#u lump()按组获取前n个级别,并将其余级别放入';其他';?_R_Dplyr_Plyr_R Factor - Fatal编程技术网

R 如何使用fct#u lump()按组获取前n个级别,并将其余级别放入';其他';?

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

我试图根据一个聚合变量在每个组中找到前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 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