#加载dplyr包library(dplyr)## ## Attaching package: 'dplyr'## The following objects are masked from 'package:stats':## ## filter, lag## The following objects are masked from 'package:base':## ## intersect, setdiff, setequal, unionlibrary(openxlsx)library(knitr)library(rmarkdown)#设置默认路径default.path <- c("D:\\R\\RCourse\\dplyr")setwd(default.path)#利用openxlsx包读取财务衍生数据finance.data <- read.xlsx(xlsxFile = "财务衍生数据.xlsx", sheet = 1)class(finance.data)#使用dplyr包的之前,建议最好对读入的数据进行tbl_df转换,经过tbl_df转换后的数据,会有多个属性finance.data <- tbl_df(finance.data)class(finance.data)## [1] "data.frame"## [1] "tbl_df" "tbl" "data.frame"简介dplyr是R语言中使用频次非常高的一个包,主要用来对数据进行预处理,灵活、强大,是Rer必须掌握的一个包。
常用函数
- arrange
- select
- tbl_df
- between
- bind
- case_when
- count
- desc
- do
- filter
- first
- groups
- group_by
- if_else
- inner_join
- join
- left_join
- last
- matches
- mutate
- mutate_if
- n
- select
- summarise
- tbl
- transmute
selectselect函数可以选取指定的对象中的列数据
#下面我们通过使用select函数来选取finance.data中的几列数据#选取一列finance.data.select <- head(select(finance.data,证券代码))#选取两列及以上finance.data.select <- head(select(finance.data,证券代码,roe_ma))当然,除此之外,还可以使用start_with,end_with,contains,matches函数来配合select函数一起使用
#配合start_with函数,可以选取任意字符开头的列finance.data.select <- head(select(finance.data, starts_with("o")))#配合end_with函数,可以选取任意字符结尾的列finance.data.select <- head(select(finance.data, starts_with("g")))#配合contains函数,可以选取包含任意字符的列finance.data.select <- head(select(finance.data, contains("o")))#配合matches函数,可以选取符合正则规则的列finance.data.select <- head(select(finance.data, matches("g")))
filterfilter是一个过滤函数,通过这个函数可以筛选出符合条件的数据。
#首先选取finance.data中的两列finance.data.select <- select(finance.data,证券代码,roe_ma)#使用filter函数保留roe_ma列中大于15以上的行finance.data.select <- filter(finance.data.select, finance.data.select$roe_ma>15)#使用filter函数保留roe_ma列中大于15且小于20的行finance.data.select <- filter(finance.data.select, finance.data.select$roe_ma>15 & finance.data.select$roe_ma < 20)
betweenbetween主要筛选介于两个值之间的数据。
#判断roe_ma的值介于17和18之间finance.data.select$roe_ma_if <- between(finance.data.select$roe_ma,17,18)#筛选roe_ma_if中为TRUE的行filter(finance.data.select, finance.data.select$roe_ma_if==TRUE)## # A tibble: 15 × 3## 证券代码 roe_ma roe_ma_if## <chr> <dbl> <lgl>## 1 000418.SZ 17.27 TRUE## 2 000848.SZ 17.03 TRUE## 3 000895.SZ 17.38 TRUE## 4 000921.SZ 17.20 TRUE## 5 002071.SZ 17.76 TRUE## 6 002108.SZ 17.09 TRUE## 7 002270.SZ 17.91 TRUE## 8 002400.SZ 17.25 TRUE## 9 002595.SZ 17.89 TRUE## 10 002701.SZ 17.48 TRUE## 11 300136.SZ 17.36 TRUE## 12 600201.SH 17.12 TRUE## 13 600887.SH 17.04 TRUE## 14 601012.SH 17.04 TRUE## 15 603589.SH 17.36 TRUE
case_whencase_when在对数据重编码情况下经常用到。
#首先选取finance.data中的两列finance.data.select <- select(finance.data,证券代码,roe_ma)finance.data.select <- tbl_df(finance.data.select)#使用case_when进行重编码finance.data.select$roe_ma_if <- case_when( finance.data.select$roe_ma < 10 ~ "one", finance.data.select$roe_ma < 20 ~ "two", finance.data.select$roe_ma >= 20 ~ "three")head(finance.data.select,10)## # A tibble: 10 × 3## 证券代码 roe_ma roe_ma_if## <chr> <dbl> <chr>## 1 000001.SZ 9.91 one## 2 000002.SZ 11.80 two## 3 000008.SZ 2.33 one## 4 000010.SZ 2.81 one## 5 000012.SZ 7.02 one## 6 000018.SZ 54.25 three## 7 000021.SZ 2.69 one## 8 000026.SZ 3.10 one## 9 000028.SZ 9.82 one## 10 000034.SZ 2.82 one
if_elseif_else类似excel中的if函数,类似R基础包中的ifelse函数,唯一不同的是,if_else中包含一个对缺失值处理的参数。
#首先选取finance.data中的两列finance.data.select <- select(finance.data,证券代码,roe_ma)finance.data.select <- tbl_df(finance.data.select)#使用if_elsefinance.data.select$roe_ma_if <- if_else(finance.data.select$roe_ma>10, "big", "small", "missing")head(finance.data.select$roe_ma_if,20)## [1] "small" "big" "small" "small" "small" "big" "small" ## [8] "small" "small" "small" "small" "small" "missing" "small" ## [15] "small" "missing" "small" "big" "small" "small"
arrangearrange函数使用desc函数来对数据排序。
arrange(finance.data, roe_ma)## # A tibble: 1,970 × 17## 证券代码 证券简称 一级行业分类 二级行业分类 日期 roe_ma## <chr> <chr> <chr> <chr> <dbl> <dbl>## 1 000711.SZ 京蓝科技 房地产 房地产开发管理 42667 0.00## 2 002608.SZ *ST 舜船 机械 运输设备 42667 0.00## 3 300116.SZ 坚瑞消防 机械 其他专用设备 42667 0.00## 4 600242.SH 中昌海运 交通运输 航运港口 42667 0.00## 5 600306.SH *ST 商城 商贸零售 零售 42667 0.00## 6 600508.SH 上海能源 煤炭 煤炭开采洗选 42667 0.01## 7 600222.SH 太龙药业 医药 中药生产 42667 0.02## 8 000426.SZ 兴业矿业 有色金属 稀有金属 42667 0.03## 9 000785.SZ 武汉中商 商贸零售 零售 42667 0.05## 10 000778.SZ 新兴铸管 钢铁 普钢 42667 0.06## # ... with 1,960 more rows, and 11 more variables: roe_avg <chr>,## # eps_ma <chr>, eps_avg <chr>, opps_avg <chr>, npr_avg <chr>,## # drdAdj_1y <dbl>, drdAdj_1y_ig <dbl>, naps <chr>, naps_ig <chr>,## # ocfps <chr>, ocfps_ig <chr>
mutatefinance.data.select <- select(finance.data,roe_ma)mutate(finance.data.select, roe_ma_add=roe_ma/15)## # A tibble: 1,970 × 2## roe_ma roe_ma_add## <dbl> <dbl>## 1 9.91 0.6606667## 2 11.80 0.7866667## 3 2.33 0.1553333## 4 2.81 0.1873333## 5 7.02 0.4680000## 6 54.25 3.6166667## 7 2.69 0.1793333## 8 3.10 0.2066667## 9 9.82 0.6546667## 10 2.82 0.1880000## # ... with 1,960 more rows
summarisefinance.data.select <- select(finance.data,roe_ma)summarise(finance.data.select, sum(roe_ma,na.rm = TRUE))## # A tibble: 1 × 1## `sum(roe_ma, na.rm = TRUE)`## <dbl>## 1 11990.85