filter() 中的多个参数是由“与”组合起来的:每个表达式都必须为真才能让一行观测包
含在输出中。如果要实现其他类型的组合,你需要使用布尔运算符: & 表示“与”、 | 表示
“或”、 ! 表示“非”。
使用dplyr进行数据转换
以下代码可以找出 11 月或 12 月出发的所有航班:
filter(flights, month == 11 | month == 12)
表达式中的运算顺序和语言中的是不一样的。你不能写成 filter(flights, month == 11 |
12) 这种形式。这种形式的文字翻译确实是“找出 11 月或 12 月出发的所有航班”,但在代
码中则不是这个意思,代码中的含义是找出所有出发月份为 11 | 12 的航班。 11 | 12 这个
逻辑表达式的值为 TRUE,在数字语境中(如本例), TRUE 就是 1,所以这段代码找出的不
是 11 月或 12 月出发的航班,而是 1 月出发的所有航班。真是够绕的!
这种问题有一个有用的简写形式: x %in% y。这会选取出 x 是 y 中的一个值时的所有行。
我们可以使用这种形式重写上面的代码:
nov_dec <- filter(flights, month %in% c(11, 12))
有时你可以使用德摩根定律将复杂的筛选条件进行简化: !(x & y) 等价于 !x | !y、 !(x |
y) 等价于 !x & !y。例如,如果想要找出延误时间(到达或出发)不多于 2 小时的航班,
那么使用以下两种筛选方式均可:
filter(flights, !(arr_delay > 120 | dep_delay > 120))
filter(flights, arr_delay <= 120, dep_delay <= 120)
除 & 和 | 之外, R 中还有 && 和 || 运算符。先不要使用这两个运算符!
只要 filter() 函数中使用的是复杂的、包含多个部分的表达式,就需要考虑用一个明确的
变量来代替它。这样检查代码会容易很多。我们很快就会介绍如何创建新变量。
暂无数据