加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数据处理之——dplyr

发布时间:2020-12-14 01:35:45 所属栏目:大数据 来源:网络整理
导读:dplyr 简介 关于 R 中的数据处理,上期我们介绍了 plyr ,这期我们接着介绍数据处理相关包 dplyr 。 dplyr 其实可以看做是 plyr 的升级版, dplyr 中的 d 指 dataframe ,它专注于做基于数据框的处理。如果你熟悉了 dplyr 的这一套处理函数,它将会大大提升

dplyr简介

关于R中的数据处理,上期我们介绍了plyr,这期我们接着介绍数据处理相关包dplyrdplyr其实可以看做是plyr的升级版,dplyr中的ddataframe,它专注于做基于数据框的处理。如果你熟悉了dplyr的这一套处理函数,它将会大大提升你处理数据的速度和效率。

示例数据

dplyr中使用的示例数据继续沿用pgdat数据集,如果你想要获取该数据集的源代码,可以通过点击微信公众号右下角的案例数据得到。

单表操作函数

select

  • select(.data,...): 该函数实现了对数据集的列进行选取

  • rename(.data,...): 该函数可以对数据集的列名进行重命名,会保留完整数据集

## 在pgdat数据集中选择场次、球员姓名、助攻数、得分、抢断、失误数据
pgdat1 <- select(pgdat,rk,0);">player,0);">ast,0);">pts,0);">stl,0);">tov)
headpgdat1)
## ? rk player ast pts stl tov
## 1 ?1 ? 库里 ? 6 ?46 ? 2 ? 2
## 2 ?2 ? 库里 ? 5 ?37 ? 2 ? 4
## 3 ?3 ? 库里 ? 8 ?17 ? 1 ? 2
## 4 ?4 ? 库里 ? 9 ?27 ? 2 ? 3
## 5 ?5 ? 库里 ?15 ?21 ? 3 ? 3
## 6 ?6 ? 库里 ? 7 ?39 ? 2 ? 4
renamepgdat1,0);">name = player## ? rk name ast pts stl tov
## 1 ?1 库里 ? 6 ?46 ? 2 ? 2
## 2 ?2 库里 ? 5 ?37 ? 2 ? 4
## 3 ?3 库里 ? 8 ?17 ? 1 ? 2
## 4 ?4 库里 ? 9 ?27 ? 2 ? 3
## 5 ?5 库里 ?15 ?21 ? 3 ? 3
## 6 ?6 库里 ? 7 ?39 ? 2 ? 4

filter/slice

  • filter(.data,...): 该函数返回匹配条件的数据行,实现了对数据集的行进行选取

  • slice(.data,...): 该函数可以通过行位置对数据集进行筛选,它也是对数据集的行进行选取的一种方式

# 选择得分大于40分的数据
filterpts > 40) %>% head
## ? rk name ast pts stl tov
## 1 ?1 库里 ? 6 ?46 ? 2 ? 2
## 2 21 库里 ? 3 ?41 ? 4 ? 5
## 3 24 库里 ? 6 ?46 ? 2 ? 3
## 4 25 库里 ? 8 ?51 ? 0 ? 5
## 5 26 库里 ? 7 ?42 ? 1 ? 7
## 6 33 库里 ? 2 ?51 ? 3 ? 7
# 选择助攻数大于15的数据
ast 15## ? rk name ast pts stl tov ## 1 ?6 保罗 ?16 ?20 ? 1 ? 2 ## 2 13 保罗 ?16 ?15 ? 2 ? 3 ## 3 17 保罗 ?16 ?12 ? 5 ? 3 ## 4 44 保罗 ?19 ?21 ? 1 ? 3 ## 5 58 保罗 ?18 ?18 ? 0 ? 2 ## 6 ?6 沃尔 ?16 ?22 ? 2 ? 4
slice(pgdat1,1:6)
## ? rk name ast pts stl tov
## 1 ?1 库里 ? 6 ?46 ? 2 ? 2
## 2 ?2 库里 ? 5 ?37 ? 2 ? 4
## 3 ?3 库里 ? 8 ?17 ? 1 ? 2
## 4 ?4 库里 ? 9 ?27 ? 2 ? 3
## 5 ?5 库里 ?15 ?21 ? 3 ? 3
## 6 ?6 库里 ? 7 ?39 ? 2 ? 4

为了显示方便,这里的数据用head函数做了处理,仅显示前几行数据,%>%操作符会在本文下文中做介绍,此处可暂时忽略。

arrange

  • arrange(.data,...): 该函数可以按照列变量对数据进行排序

# 把数据按得分和助攻数降序排列
descpts),0);">ast)## ? rk name ast pts stl tov ## 1 ?1 库里 ? 6 ?46 ? 2 ? 2 ## 2 ?2 库里 ? 5 ?37 ? 2 ? 4 ## 3 ?3 库里 ? 8 ?17 ? 1 ? 2 ## 4 ?4 库里 ? 9 ?27 ? 2 ? 3 ## 5 ?5 库里 ?15 ?21 ? 3 ? 3 ## 6 ?6 库里 ? 7 ?39 ? 2 ? 4

arrange的用法同plyr包中的arrange,想要详细了解参见前期文章数据处理之——plyr

distinct

  • distinct(.data,...): 该函数可以按照列变量对数据进行去重处理

# 把数据按球员进行去重处理
distinctname## ? rk name ast pts stl tov ## 1 ?1 库里 ? 6 ?46 ? 2 ? 2 ## 2 ?1 康利 ? 4 ?22 ? 2 ? 1 ## 3 ?1 保罗 ?13 ?12 ? 2 ? 5 ## 4 ?1 沃尔 ?13 ?15 ? 1 ? 3 ## 5 ?1 威少 ?14 ?13 ? 1 ? 3 ## 6 ?1 欧文 ? 5 ?35 ? 2 ? 6

值得特别注意的是,用该函数进行数据列的去重处理时会仅保留最先出现的数据行。

mutate/transmute

  • mutate(.data,...): 该函数增加新的数据列,并保留原先的数据列

  • transmute(.data,...): 该函数仅新增数据列,不保留原先的数据列

## 计算球员的助攻失误比以及效率值
mutateatr ifelsetov 0,0);">roundast/tov,2NAper = pts+rebstlblk)-fga-fgmftaftm## ? rk player wl ? ? ? ? ? ? match gs min ? fgp fgm fga ? p3p p3m p3a ? ?ftp ## 1 ?1 ? 库里 胜 ? 灰熊104-125勇士 ?1 ?30 62.5% ?15 ?24 52.6% ?10 ?19 100.0% ## 2 ?2 ? 库里 胜 ? ? 马刺86-92勇士 ?1 ?35 59.1% ?13 ?22 44.4% ? 4 ? 9 100.0% ## 3 ?3 ? 库里 胜 ? ?灰熊99-100勇士 ?1 ?34 31.8% ? 7 ?22 21.4% ? 3 ?14 ? ? ? ## 4 ?4 ? 库里 胜 ? 马刺101-112勇士 ?1 ?36 57.9% ?11 ?19 42.9% ? 3 ? 7 100.0% ## 5 ?5 ? 库里 负 森林狼124-117勇士 ?1 ?43 28.0% ? 7 ?25 28.6% ? 4 ?14 100.0% ## 6 ?6 ? 库里 胜 开拓者111-136勇士 ?1 ?35 61.9% ?13 ?21 69.2% ? 9 ?13 100.0% ## ? ftm fta reb oreb dreb ast stl blk tov pf pts ?atr per ## 1 ? 6 ? 6 ? 4 ? ?1 ? ?3 ? 6 ? 2 ? 0 ? 2 ?2 ?46 3.00 ?47 ## 2 ? 7 ? 7 ? 5 ? ?0 ? ?5 ? 5 ? 2 ? 0 ? 4 ?4 ?37 1.25 ?36 ## 3 ? 0 ? 0 ? 9 ? ?0 ? ?9 ? 8 ? 1 ? 0 ? 2 ?1 ?17 4.00 ?18 ## 4 ? 2 ? 2 ? 5 ? ?0 ? ?5 ? 9 ? 2 ? 0 ? 3 ?2 ?27 3.00 ?32 ## 5 ? 3 ? 3 ? 6 ? ?2 ? ?4 ?15 ? 3 ? 0 ? 3 ?4 ?21 5.00 ?24 ## 6 ? 4 ? 4 ? 6 ? ?2 ? ?4 ? 7 ? 2 ? 1 ? 4 ?2 ?39 1.75 ?43
transmute## ? ?atr per
## 1 3.00 ?47
## 2 1.25 ?36
## 3 4.00 ?18
## 4 3.00 ?32
## 5 5.00 ?24
## 6 1.75 ?43

R的基本函数中transform也有类似mutate的功能,但是mutate的优势是可以在新增的数据列的基础上,继续使用新增的数据列生成新的数据列,而transform不支持,它会报错。这部分没做数据演示,可自行尝试。

summarise

  • summarise(.data,...): 该函数可以操作多列数据,生成单个数值。

summarisemast meanmpts ## ? ? ? mast ? ?mpts
## 1 8.305489 21.7852

sample_n/sample_frac

  • sample_n(tbl,size,...): 给定抽样数据条数,按行进行数据抽样

  • sample_frac(tbl,...): 给定抽样数据比率,按行进行数据抽样

# 随机抽取5条数据
sample_n5## ? ? ?rk name ast pts stl tov ## 1320 60 沃尔 ?10 ?28 ? 5 ? 2 ## 863 ?23 保罗 ?10 ?17 ? 4 ? 2 ## 2146 46 欧文 ? 2 ?13 ? 0 ? 4 ## 54 ? 54 库里 ? 7 ?25 ? 1 ? 3 ## 1261 ?1 沃尔 ?13 ?15 ? 1 ? 3
# 按0.01比例抽取部分数据
sample_frac0.01## ? ? ?rk name ast pts stl tov ## 1274 14 沃尔 ? 9 ?24 ? 1 ? 4 ## 59 ? 59 库里 ? 7 ?44 ? 0 ? 3 ## 2109 ?9 欧文 ? 8 ?16 ? 1 ? 2 ## 1332 72 沃尔 ?11 ?19 ? 2 ? 7

分组操作函数

group_by

  • group_by(.data,...): 按数据列对数据进行分组

# 按球员进行分组
by_player group_by)
# 分组计算场均得分以及助攻数据
mydat by_player,0);">toln n(# ggplot2数据可视化
ggplotmydat,0);">aesmpts,0);">mast+ ?geom_pointcol size=5,0);">alpha = 3/labstitle="场均得分与助攻分布",0);">x"得分",0);">y"助攻")

管道操作?%>% or %.%

  • lhs %.% rhs: 管道操作符

管道操作符可以把前面计算的结果输出作为后续计算的输入,它有两个好处,

第一,它的使用可以大大简化程序的中间赋值操作,从而提高代码写作的效率;

第二,在查阅代码时,代码的逻辑层次结构也非常清晰易读。我们来看看如下示例:

  • 普通版

dat1 dat2 dat1,0);">dat3 dat2,0);">dat4 dat3,153);">20 & 10dat4
## Source: local data frame [1 x 4]
## 
## ? player ?toln ? mast ? mpts
## ? ?(chr) (int) ?(dbl) ?(dbl)
## 1 ? 威少 ? ?80 10.425 23.475
  • %>%?

pgdat %>%
 ?(
 ? ?)
 ?## Source: local data frame [1 x 4]
## 
## ? player ?toln ? mast ? mpts
## ? ?(chr) (int) ?(dbl) ?(dbl)
## 1 ? 威少 ? ?80 10.425 23.475

两表操作函数

表关联

dplyr里有四种表关联函数,功能不尽相同,我们通过下面的例子来说明:

df1 data_framex c(1,0);">y 2:1## Source: local data frame [2 x 2]
## 
## ? ? ? x ? ? y
## ? (dbl) (int)
## 1 ? ? 1 ? ? 2
## 2 ? ? 2 ? ? 1
df2 3a 10,0);">b = "a"## Source: local data frame [2 x 3]
## 
## ? ? ? x ? ? a ? ? b
## ? (dbl) (dbl) (chr)
## 1 ? ? 1 ? ?10 ? ? a
## 2 ? ? 3 ? ?10 ? ? a
  • inner_join(x,y)?内连接,提取xy所有匹配上的数据

inner_joindf2## Source: local data frame [1 x 4]
## 
## ? ? ? x ? ? y ? ? a ? ? b
## ? (dbl) (int) (dbl) (chr)
## 1 ? ? 1 ? ? 2 ? ?10 ? ? a
  • left_join(x,y)?左连接,它包括所有的x数据,以及所有和x匹配上的y的数据。

left_join## Joining by: "x"
## Source: local data frame [2 x 4]
## 
## ? ? ? x ? ? y ? ? a ? ? b
## ? (dbl) (int) (dbl) (chr)
## 1 ? ? 1 ? ? 2 ? ?10 ? ? a
## 2 ? ? 2 ? ? 1 ? ?NA ? ?NA
  • right_join(x,y)?右连接,它包括所有的y数据,以及所有和y匹配上的x的数据。

right_join## Source: local data frame [2 x 4]
## 
## ? ? ? x ? ? y ? ? a ? ? b
## ? (dbl) (int) (dbl) (chr)
## 1 ? ? 1 ? ? 2 ? ?10 ? ? a
## 2 ? ? 3 ? ?NA ? ?10 ? ? a
df1## Source: local data frame [2 x 4]
## 
## ? ? ? x ? ? a ? ? b ? ? y
## ? (dbl) (dbl) (chr) (int)
## 1 ? ? 1 ? ?10 ? ? a ? ? 2
## 2 ? ? 3 ? ?10 ? ? a ? ?NA
  • full_join()?全连接,它包括所有xy数据.

full_join## Source: local data frame [3 x 4]
## 
## ? ? ? x ? ? y ? ? a ? ? b
## ? (dbl) (int) (dbl) (chr)
## 1 ? ? 1 ? ? 2 ? ?10 ? ? a
## 2 ? ? 2 ? ? 1 ? ?NA ? ?NA
## 3 ? ? 3 ? ?NA ? ?10 ? ? a

集合操作

  • intersect(x,y): 集合取交集

  • union(x,y): 集合取并集

  • setdiff(x,y): 取x中与y不同的部分

12,153);">1L,153);">1L## Source: local data frame [2 x 2]
## 
## ? ? ? x ? ? y
## ? (int) (int)
## 1 ? ? 1 ? ? 1
## 2 ? ? 2 ? ? 1
## Source: local data frame [2 x 2]
## 
## ? ? ? x ? ? y
## ? (int) (int)
## 1 ? ? 1 ? ? 1
## 2 ? ? 2 ? ? 2
intersectdf1,204); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: white;">## Source: local data frame [1 x 2]
## 
## ? ? ? x ? ? y
## ? (int) (int)
## 1 ? ? 1 ? ? 1
union## Source: local data frame [3 x 2]
## 
## ? ? ? x ? ? y
## ? (int) (int)
## 1 ? ? 1 ? ? 1
## 2 ? ? 2 ? ? 1
## 3 ? ? 2 ? ? 2
setdiff## Source: local data frame [1 x 2]
## 
## ? ? ? x ? ? y
## ? (int) (int)
## 1 ? ? 2 ? ? 1
df2,204); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; background-color: white;">## Source: local data frame [1 x 2]
## 
## ? ? ? x ? ? y
## ? (int) (int)
## 1 ? ? 2 ? ? 2

等价关系

R中的两表操作函数与sql有如下等价关系:

小结

本文介绍了dplyr的主要功能,但是它还有一些特殊的函数及功能,比如介绍了如何连接Mysql等结构化数据库;介绍了不用写sql语句便可对数据库中的数据进行查询的方法;还有当采用mutate函数进行数据整合时,如何利用窗口函数等等,这些听起来是不是很炫酷啊,那么就开始你自己的dplyr之旅吧!


?本文来自№→★飞刀的微信公共帐号“数据挖掘与R语言”,用微信添加数据挖掘与R语言公众号,即可订阅。转载必须保留作者、公共帐号信息。

长按识别图中二维码?


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读