我有一個資料集,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() 指令。于是我開始懷疑一切。非常感謝大家,我在這個程序中損失了幾個小時......
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/388786.html
標籤:r
下一篇:在R中檢測具有多個觀察值的行
