我有一个资料集,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 评论