8 逻辑变量
8.1 逻辑运算
创建逻辑向量的最常用方法是使用比较运算符:
<、<=、>、>=、!=和==。在比较运算过程中,要注意
=和==的区别:=用于赋值,而==用于比较。逻辑运算符包括与(
&)、或(|) 和 非(!),以及xor()函数—意为”异或”。下图展示了这些逻辑运算符的运算规则:
- 使用
is.na()函数来检测缺失值。
# 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>
# 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 逻辑汇总
逻辑汇总函数:
any(x)相当于逻辑“或”,只要x中存在任意一个TRUE就返回TRUE。all(x)相当于逻辑“与”,只有当x中所有值都是TRUE时才返回TRUE。数值汇总函数:逻辑向量在数值情境下会自动转换:
TRUE变成 1,FALSE变成 0。从而可用sum()统计TRUE的个数,mean()计算TRUE的比例。逻辑子集筛选:逻辑向量可以用来对单个变量进行子集筛选,主要利用中括号[]。形如:
arr_delay[ arr_delay < 0 ]。
# 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是对应condition为TRUE时的输出值。
重要
需要注意,TRUE和FALSE对应输出的值必须兼容,比如字符串和数值不兼容。以下为常见的兼容类型:
- 数值与逻辑向量兼容
- 字符串与因子类型兼容
-
NA与所有类型兼容