filter() 中的多個(gè)參數(shù)是由“與”組合起來的:每個(gè)表達(dá)式都必須為真才能讓一行觀測(cè)包
含在輸出中。如果要實(shí)現(xiàn)其他類型的組合,你需要使用布爾運(yùn)算符: & 表示“與”、 | 表示
“或”、 ! 表示“非”。
使用dplyr進(jìn)行數(shù)據(jù)轉(zhuǎn)換
以下代碼可以找出 11 月或 12 月出發(fā)的所有航班:
filter(flights, month == 11 | month == 12)
表達(dá)式中的運(yùn)算順序和語言中的是不一樣的。你不能寫成 filter(flights, month == 11 |
12) 這種形式。這種形式的文字翻譯確實(shí)是“找出 11 月或 12 月出發(fā)的所有航班”,但在代
碼中則不是這個(gè)意思,代碼中的含義是找出所有出發(fā)月份為 11 | 12 的航班。 11 | 12 這個(gè)
邏輯表達(dá)式的值為 TRUE,在數(shù)字語境中(如本例), TRUE 就是 1,所以這段代碼找出的不
是 11 月或 12 月出發(fā)的航班,而是 1 月出發(fā)的所有航班。真是夠繞的!
這種問題有一個(gè)有用的簡寫形式: x %in% y。這會(huì)選取出 x 是 y 中的一個(gè)值時(shí)的所有行。
我們可以使用這種形式重寫上面的代碼:
nov_dec <- filter(flights, month %in% c(11, 12))
有時(shí)你可以使用德摩根定律將復(fù)雜的篩選條件進(jìn)行簡化: !(x & y) 等價(jià)于 !x | !y、 !(x |
y) 等價(jià)于 !x & !y。例如,如果想要找出延誤時(shí)間(到達(dá)或出發(fā))不多于 2 小時(shí)的航班,
那么使用以下兩種篩選方式均可:
filter(flights, !(arr_delay > 120 | dep_delay > 120))
filter(flights, arr_delay <= 120, dep_delay <= 120)
除 & 和 | 之外, R 中還有 && 和 || 運(yùn)算符。先不要使用這兩個(gè)運(yùn)算符!
只要 filter() 函數(shù)中使用的是復(fù)雜的、包含多個(gè)部分的表達(dá)式,就需要考慮用一個(gè)明確的
變量來代替它。這樣檢查代碼會(huì)容易很多。我們很快就會(huì)介紹如何創(chuàng)建新變量。








暫無數(shù)據(jù)