8  逻辑变量

8.1 逻辑运算

  • 创建逻辑向量的最常用方法是使用比较运算符:<<=>>=!===

  • 在比较运算过程中,要注意=== 的区别:= 用于赋值,而 == 用于比较。

  • 逻辑运算符包括与(&)、或(|) 和 非(!),以及xor() 函数—意为”异或”。下图展示了这些逻辑运算符的运算规则:

  • 逻辑变量在数据转换中非常有用,常用于filter()函数中筛选数据,或在mutate()函数中创建新的变量。

图 8.1: 布尔逻辑运算符号
  • 使用is.na()函数来检测缺失值。
# 比较运算符示例
flights |>
  mutate(
    daytime = dep_time > 600 & dep_time < 2000,
    approx_ontime = abs(arr_delay) < 20,
    .keep = "used"
  )
# A tibble: 336,776 × 4
   dep_time arr_delay daytime approx_ontime
      <int>     <dbl> <lgl>   <lgl>        
 1      517        11 FALSE   TRUE         
 2      533        20 FALSE   FALSE        
 3      542        33 FALSE   FALSE        
 4      544       -18 FALSE   TRUE         
 5      554       -25 FALSE   FALSE        
 6      554        12 FALSE   TRUE         
 7      555        19 FALSE   TRUE         
 8      557       -14 FALSE   TRUE         
 9      557        -8 FALSE   TRUE         
10      558         8 FALSE   TRUE         
# ℹ 336,766 more rows
# boolean algebra 示例
flights |> 
  filter(month == 11 | month == 12)
# A tibble: 55,403 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013    11     1        5           2359         6      352            345
 2  2013    11     1       35           2250       105      123           2356
 3  2013    11     1      455            500        -5      641            651
 4  2013    11     1      539            545        -6      856            827
 5  2013    11     1      542            545        -3      831            855
 6  2013    11     1      549            600       -11      912            923
 7  2013    11     1      550            600       -10      705            659
 8  2013    11     1      554            600        -6      659            701
 9  2013    11     1      554            600        -6      826            827
10  2013    11     1      554            600        -6      749            751
# ℹ 55,393 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>
# 以上等同于
flights |>
  filter(month  %in% c(11, 12))
# A tibble: 55,403 × 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
 1  2013    11     1        5           2359         6      352            345
 2  2013    11     1       35           2250       105      123           2356
 3  2013    11     1      455            500        -5      641            651
 4  2013    11     1      539            545        -6      856            827
 5  2013    11     1      542            545        -3      831            855
 6  2013    11     1      549            600       -11      912            923
 7  2013    11     1      550            600       -10      705            659
 8  2013    11     1      554            600        -6      659            701
 9  2013    11     1      554            600        -6      826            827
10  2013    11     1      554            600        -6      749            751
# ℹ 55,393 more rows
# ℹ 11 more variables: arr_delay <dbl>, carrier <chr>, flight <int>,
#   tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>

8.2 逻辑汇总

  1. 逻辑汇总函数:any(x) 相当于逻辑“或”,只要 x 中存在任意一个 TRUE 就返回 TRUEall(x) 相当于逻辑“与”,只有当 x 中所有值都是 TRUE 时才返回TRUE

  2. 数值汇总函数:逻辑向量在数值情境下会自动转换:TRUE 变成 1,FALSE 变成 0。从而可用sum() 统计 TRUE 的个数,mean() 计算 TRUE 的比例。

  3. 逻辑子集筛选:逻辑向量可以用来对单个变量进行子集筛选,主要利用中括号[]。形如:arr_delay[ arr_delay < 0 ]

flights |> 
  group_by(year, month, day) |> 
  summarise(
    all_delay = all(dep_delay <= 60, na.rm = TRUE), # 是否所有航班的延误均不超过60分钟
    any_long_delay = any(dep_delay > 300, na.rm = TRUE), # 是否存在延误超过120分钟的航班
    .groups = "drop")
# A tibble: 365 × 5
    year month   day all_delay any_long_delay
   <int> <int> <int> <lgl>     <lgl>         
 1  2013     1     1 FALSE     TRUE          
 2  2013     1     2 FALSE     TRUE          
 3  2013     1     3 FALSE     FALSE         
 4  2013     1     4 FALSE     FALSE         
 5  2013     1     5 FALSE     TRUE          
 6  2013     1     6 FALSE     FALSE         
 7  2013     1     7 FALSE     TRUE          
 8  2013     1     8 FALSE     FALSE         
 9  2013     1     9 FALSE     TRUE          
10  2013     1    10 FALSE     TRUE          
# ℹ 355 more rows

8.3 条件转换

若想在某个条件为 TRUE 时使用一个值,为 FALSE 时使用另一个值时,可以使用 dplyr::case_when()函数。

  • case_when() 函数允许你为多个条件指定不同的输出值,接收形如condition ~ value 的表达式,其中condition 是逻辑表达式或变量(及筛选变量的函数),value 是对应conditionTRUE时的输出值。
重要

需要注意,TRUEFALSE对应输出的值必须兼容,比如字符串和数值不兼容。以下为常见的兼容类型:

  • 数值与逻辑向量兼容
  • 字符串与因子类型兼容
  • NA 与所有类型兼容

8.4 小节

  • 逻辑向量的值必须是TRUE,FALSENA之一。
  • 常用的逻辑运算符参见 小节 8.1
  • 逻辑向量用处非常广泛,我们在 章节 10章节 12 均会再次用到逻辑向量的相关知识。