本期主要介绍dplyr[1]包的中filter() 函数相关用法,filter() (Subset rows using column values)
函数主要用于数据框的行筛选,是数据预处理过程中一个十分重要的函数。
1.读入数据
以国家统计局[2]官网上关于2001-2020年我国31个省份人均GDP数据(未包含港澳台数据)为例,数据为面板形式。
> library(tidyverse)
> data <- readxl::read_xlsx("GDPdf.xlsx")
> head(data)
# A tibble: 6 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 北京 东部地区 2020 164889
2 天津 东部地区 2020 101614
3 河北 东部地区 2020 48564
4 山西 中部地区 2020 50528
5 内蒙 西部地区 2020 72062
6 辽宁 东北地区 2020 58872
2.数值型变量处理
针对数值型变量常用大于(>)
、小于(<)
、等于(==)
相关符号,注意等于为两个等号。
> data %>% filter(PerGDP > 100000 & year == 2020)
# A tibble: 6 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 北京 东部地区 2020 164889
2 天津 东部地区 2020 101614
3 上海 东部地区 2020 155768
4 江苏 东部地区 2020 121231
5 浙江 东部地区 2020 100620
6 福建 东部地区 2020 105818
>
> data %>% filter(PerGDP > 100000 & PerGDP < 120000 & year == 2020)
# A tibble: 3 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 天津 东部地区 2020 101614
2 浙江 东部地区 2020 100620
3 福建 东部地区 2020 105818
针对年份等连续型数值的筛选,可使用filter(var %in% start:end)
的形式进行筛选,简化代码量。如筛选出时间在2015-2020年的数据:
> data %>% filter(year %in% 2015:2020)
# A tibble: 186 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 北京 东部地区 2020 164889
2 天津 东部地区 2020 101614
3 河北 东部地区 2020 48564
4 山西 中部地区 2020 50528
5 内蒙 西部地区 2020 72062
6 辽宁 东北地区 2020 58872
7 吉林 东北地区 2020 50800
8 黑龙江 东北地区 2020 42635
9 上海 东部地区 2020 155768
10 江苏 东部地区 2020 121231
# ... with 176 more rows
# i Use `print(n = ...)` to see more rows
或者使用filter(var %in% c(start:end))
形式:
> data %>% filter(year %in% c(2015:2020))
# A tibble: 186 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 北京 东部地区 2020 164889
2 天津 东部地区 2020 101614
3 河北 东部地区 2020 48564
4 山西 中部地区 2020 50528
5 内蒙 西部地区 2020 72062
6 辽宁 东北地区 2020 58872
7 吉林 东北地区 2020 50800
8 黑龙江 东北地区 2020 42635
9 上海 东部地区 2020 155768
10 江苏 东部地区 2020 121231
# ... with 176 more rows
# i Use `print(n = ...)` to see more rows
3.字符型变量处理
单个条件
针对单个条件,常使用filter(var == "condition")
形式进行筛选。如筛选出江苏
的数据:
> data %>% filter(province == "江苏")
# A tibble: 20 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 江苏 东部地区 2020 121231
2 江苏 东部地区 2019 122398
3 江苏 东部地区 2018 115930
4 江苏 东部地区 2017 107150
5 江苏 东部地区 2016 96840
6 江苏 东部地区 2015 89426
7 江苏 东部地区 2014 81550
8 江苏 东部地区 2013 74844
9 江苏 东部地区 2012 67896
10 江苏 东部地区 2011 61947
去除江苏
的数据:
> data %>% filter(!province == "江苏")
# A tibble: 600 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 北京 东部地区 2020 164889
2 天津 东部地区 2020 101614
3 河北 东部地区 2020 48564
4 山西 中部地区 2020 50528
5 内蒙 西部地区 2020 72062
6 辽宁 东北地区 2020 58872
7 吉林 东北地区 2020 50800
8 黑龙江 东北地区 2020 42635
9 上海 东部地区 2020 155768
10 浙江 东部地区 2020 100620
# ... with 590 more rows
# i Use `print(n = ...)` to see more rows
针对多个条件
针对多个条件,常使用filter(var %in% "condition")
形式进行筛选。如筛选出江苏、浙江、安徽、上海
四地数据:
> data %>% filter(province %in% c("江苏", "浙江", "安徽", "上海"))
# A tibble: 80 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 上海 东部地区 2020 155768
2 江苏 东部地区 2020 121231
3 浙江 东部地区 2020 100620
4 安徽 中部地区 2020 63426
5 上海 东部地区 2019 156587
6 江苏 东部地区 2019 122398
7 浙江 东部地区 2019 107814
8 安徽 中部地区 2019 58072
9 上海 东部地区 2018 148744
10 江苏 东部地区 2018 115930
# ... with 70 more rows
# i Use `print(n = ...)` to see more rows
去除江苏、浙江、安徽、上海
四地数据:
> data %>% filter(!province %in% c("江苏", "浙江", "安徽", "上海")) # remove
# A tibble: 540 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 北京 东部地区 2020 164889
2 天津 东部地区 2020 101614
3 河北 东部地区 2020 48564
4 山西 中部地区 2020 50528
5 内蒙 西部地区 2020 72062
6 辽宁 东北地区 2020 58872
7 吉林 东北地区 2020 50800
8 黑龙江 东北地区 2020 42635
9 福建 东部地区 2020 105818
10 江西 中部地区 2020 56871
# ... with 530 more rows
# i Use `print(n = ...)` to see more rows
筛选含有某个字符的行
筛选含有某个字符的行时,需要借助grepl() 函数,将grepl() 函数与filter() 函数进行连用。如筛选出省份名称中含有湖
的数据:
> data %>% filter(grepl('湖', province))
# A tibble: 40 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 湖北 中部地区 2020 74440
2 湖南 中部地区 2020 62900
3 湖北 中部地区 2019 76712
4 湖南 中部地区 2019 57746
5 湖北 中部地区 2018 71109
6 湖南 中部地区 2018 52809
7 湖北 中部地区 2017 63180
8 湖南 中部地区 2017 49448
9 湖北 中部地区 2016 56836
10 湖南 中部地区 2016 45356
# ... with 30 more rows
# i Use `print(n = ...)` to see more rows
去除出省份名称中含有湖
的数据:
> data %>% filter(!grepl('湖', province))
# A tibble: 580 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 北京 东部地区 2020 164889
2 天津 东部地区 2020 101614
3 河北 东部地区 2020 48564
4 山西 中部地区 2020 50528
5 内蒙 西部地区 2020 72062
6 辽宁 东北地区 2020 58872
7 吉林 东北地区 2020 50800
8 黑龙江 东北地区 2020 42635
9 上海 东部地区 2020 155768
10 江苏 东部地区 2020 121231
# ... with 570 more rows
# i Use `print(n = ...)` to see more rows
筛选出省份名称中含有湖
或者河
的数据:
> data %>% filter(grepl('湖|河', province))
# A tibble: 80 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 河北 东部地区 2020 48564
2 河南 中部地区 2020 55435
3 湖北 中部地区 2020 74440
4 湖南 中部地区 2020 62900
5 河北 东部地区 2019 46182
6 河南 中部地区 2019 55825
7 湖北 中部地区 2019 76712
8 湖南 中部地区 2019 57746
9 河北 东部地区 2018 43108
10 河南 中部地区 2018 52114
# ... with 70 more rows
# i Use `print(n = ...)` to see more rows
去除出省份名称中含有湖
或者河
的数据:
> data %>% filter(!grepl('湖|河', province))
# A tibble: 540 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 北京 东部地区 2020 164889
2 天津 东部地区 2020 101614
3 山西 中部地区 2020 50528
4 内蒙 西部地区 2020 72062
5 辽宁 东北地区 2020 58872
6 吉林 东北地区 2020 50800
7 黑龙江 东北地区 2020 42635
8 上海 东部地区 2020 155768
9 江苏 东部地区 2020 121231
10 浙江 东部地区 2020 100620
# ... with 530 more rows
# i Use `print(n = ...)` to see more rows
4.针对缺失值的处理
筛选出为缺失值的行
筛选出province
变量为空缺值的数据:
> data %>% filter(is.na(province))
# A tibble: 0 x 4
# ... with 4 variables: province <chr>, region <chr>, year <dbl>, PerGDP <dbl>
# i Use `colnames()` to see all variable names
去除province
变量为空缺值的数据:
> data %>% filter(!is.na(province))
# A tibble: 620 x 4
province region year PerGDP
<chr> <chr> <dbl> <dbl>
1 北京 东部地区 2020 164889
2 天津 东部地区 2020 101614
3 河北 东部地区 2020 48564
4 山西 中部地区 2020 50528
5 内蒙 西部地区 2020 72062
6 辽宁 东北地区 2020 58872
7 吉林 东北地区 2020 50800
8 黑龙江 东北地区 2020 42635
9 上海 东部地区 2020 155768
10 江苏 东部地区 2020 121231
# ... with 610 more rows
# i Use `print(n = ...)` to see more rows
5.其他
更多内容可关注微信公众号日常分享的小懒猫
。
如有帮助请多多点赞哦!
参考资料
dplyr: https://cran.r-project.org/web/packages/dplyr/index.html
[2]国家统计局: https://data.stats.gov.cn/index.htm




