本文的内容由rmarkdown生成,若需要r源代码,可以加楼主头像微信,大家相互学习,一起进步!!!
#加载dplyr包
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects aremasked from 'package:stats':
## 
##    filter, lag
## The following objects aremasked from 'package:base':
## 
##    intersect, setdiff, setequal, union
library(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_else
finance.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 morevariables: 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