拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何淘汰学生少于20人的学校?

如何淘汰学生少于20人的学校?

白鹭 - 2022-02-12 2177 0 0

我有一个资料集,espana2015,一个有学校、学生......的国家。我想取消学生少于 20 人的学校。学校的变量是 CNTSCHID

dim(espana2015)
[1] 6736  106

唯一的办法,长的,手工的,效率也不高,就是学校一一写。这里只有 13 所学校的学生少于 20 人,但是如果有更多的学校,例如超过 100 所学校呢?

espana2015 %>% group_by(CNTSCHID) %>% summarise(students=n())%>%
  filter(students < 20)  %>% select (CNTSCHID) ->removeSch

removeSch
# A tibble: 13 x 1
   CNTSCHID
      <dbl>
 1 72400046
 2 72400113
 3 72400261
 4 72400314
 5 72400396
 6 72400472
 7 72400641
 8 72400700
 9 72400711
10 72400736
11 72400909
12 72400927
13 72400979

espana2015 %>% subset(!CNTSCHID %in% c(72400046,72400113,72400261,
                                      72400314,72400396,72400472,
                                      72400641,72400700,72400711,
                                      72400736,72400909,72400927,
                                      72400979)) -> new_espana2015

请帮我做得更好 Walter

uj5u.com热心网友回复:

缺少示例资料,我将在 上进行演示mtcars,其中 mycyl是您的CNTSHID.

library(dplyr)
table(mtcars$cyl)
#  4  6  8 
# 11  7 14 

mtcars %>%
  group_by(cyl) %>%
  filter(n() > 10) %>%
  ungroup()
# # A tibble: 25 x 11
#      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#  1  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
#  2  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
#  3  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
#  4  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
#  5  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
#  6  16.4     8  276.   180  3.07  4.07  17.4     0     0     3     3
#  7  17.3     8  276.   180  3.07  3.73  17.6     0     0     3     3
#  8  15.2     8  276.   180  3.07  3.78  18       0     0     3     3
#  9  10.4     8  472    205  2.93  5.25  18.0     0     0     3     4
# 10  10.4     8  460    215  3     5.42  17.8     0     0     3     4
# # ... with 15 more rows

这是有效的,因为条件 infilter决议为单个逻辑,然后为该组中的所有行回收该长度为 1 的真/假也就是说,对于cyl == 4, (n() > 10)--> (11 > 10)--> TRUE,所以过滤器是%>% filter(TRUE); dplyr::filter函式在某种意义上执行“安全回收”,其中条件必须与行数的长度相同,或长度为 1。当长度为 1 时,它本质上是在说“全有或全无”。

uj5u.com热心网友回复:

是的,我的第一个选择是使用带 (n) 的过滤器来完成它,但它不起作用,因为我没有放置 ungroup() 指令。于是我开始怀疑一切。非常感谢大家,我在这个程序中损失了几个小时......

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *