1. 筛选连接
- semi_join(x, y):保留x表中与y表中的观测相匹配的所有观测
- anti_join(x, y):丢弃x表中与y表中的观测相匹配的所有观测
半连接的使用场景:对原来的数据表进行筛选后得到了某一变量的若干个值,现在想要使用表中原来的记录来匹配这些值。
举个栗子
- 先将出现次数最多的10个目的地挑选出来
- 使用filter()实现要求
- 使用半连接semi_join()实现
> top_dest <- flights %>% count(dest,sort = T) %>% head(10)
> flights %>% filter(dest %in% top_dest$dest)
# A tibble: 141,145 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance hour minute time_hour
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dttm>
1 2013 1 1 542 540 2 923 850 33 AA 1141 N619AA JFK MIA 160 1089 5 40 2013-01-01 05:00:00
2 2013 1 1 554 600 -6 812 837 -25 DL 461 N668DN LGA ATL 116 762 6 0 2013-01-01 06:00:00
> flights %>% semi_join(top_dest)
Joining, by = "dest" #注意上面的命令没有设置“变量”的名称,所以这里的by = "dest"是自动检索的,因为就这一个相同
# A tibble: 141,145 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum origin dest air_time distance hour minute time_hour
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl> <chr> <int> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dttm>
1 2013 1 1 542 540 2 923 850 33 AA 1141 N619AA JFK MIA 160 1089 5 40 2013-01-01 05:00:00
2 2013 1 1 554 600 -6 812 837 -25 DL 461 N668DN LGA ATL 116 762 6 0 2013-01-01 06:00:00
anti_join(x, y)的用法类似。
2. 集合操作
集合操作需要x和y具有相同的变量
- intersect(x, y):返回既在x又在y中的观测
- union(x, y):返回x或y中的唯一观测
- setdiff(x, y):在x中但不在y中的观测
网友评论