dplyr包--数据操作与清洗
1.简介
在我们数据分析的实际应用中,我们可能会花费大量的时间在数据清洗上,而如果使用 R 里面自带的一些函数(base 包的 transform 等),可能会觉得力不从心,或者不是很人性化。好在我们有其他选择。这里我们介绍 dplyr 包。
首先加载包:
- install.packages("dplyr")
- library(dplyr)
单表操作函数(one table verbs)如下:
- filter: 保留满足条件的行
- select: 使用列名选出列
- arrange: 对数据的所有行排序
- mutate: 添加新的变量
- summarise: 分类汇总
这些函数的结构如下:
- operationName(.data, ...)
- operationName _(.data, ..., .dots)
- # transmute对已有列进行数据运算并添加为新列删除原来的列
- transmute(.data, ...)
- transmute_(.data, ..., .dots)
- # slice根据位置选择行
- slice(.data, ...)
- slice_(.data, ..., .dots)
参数说明:
- 第一个参数为 data frame 名
- 接下来的参数是指定函数操作的依据(或条件)
- 通常返回的是一个 data frame
为了更好地表述我们的操作,这里使用一个构造的 data frame。
- df <- data.frame(color = c(:)
- View(df)
2.filter--保留满足条件的行
- # filter返回满足条件的行
- filter(.data, ...)
- filter_(.data, ..., .dots)
filter 用于选择满足条件的观测(行),第一个参数是 data frame 名字,第二个参数是条件。这里举两个例子,我们对上面构造的 data frame 进行 filter 操作。第一个例子要求选取 color == blue 的观测; 第二个例子要求选取 value == 1 或者 value == 4 的观测。
- # 选取 `color == blue` 的观测
- > filter(df, color == "blue")
- ## color value
- # 选取 `value == ` 或者 `value == ` 的观测。
- > filter(df, value %, ))
- ## color value
效果如下:
注意: 这里需要提醒的是,对于多条件的选择,需要完整条件的,然后使用集合运算符将条件拼接起来。集合运算符有 !、|、&、xor(交补)。条件的判断符有>(=)、<(=)、==、!=、%in% (判断元素是否在集合或者列表内,返回逻辑值)。如下:
- filter(flights, dest %in% c("SFO", "OAK"))
- filter(flights, dest == "SFO" | dest == "OAK")
- # 下面是错误写法
- filter(flights, dest == "SFO" | "OAK")
3.select--选择需要的列
- # select选择需要的变量keeps only the variables you mention
- select(.data, ...)
- select_(.data, ..., .dots)
select用于选择需要的列:
- > select(df, color)
- ## color
- ## blue
- ## black
- ## blue
- ## blue
- ## black
- > select(df, -color)
- ## value
- ##
- ##
- ##
- ##
- ##
注意:select 中负号表示不选择。其中变量的声明还有其他形式,比如B:F表示从 B 列到 F 列所有列;ends_with("string") 表示选取列名以 string 结尾的全部列;contains("string") 表示选取列名中含有 string 的所有列。代码如下:
- select(flights, arr_delay, dep_delay)
- select(flights, arr_delay:dep_delay)
- select(flights, ends_with("delay"))
- select(flights, contains("delay"))
select()函数,传递的参数:
- starts_with(x,ignor.case = TRUE) # 选择以字符x开头的变量
- ends_with(x,ignore.case = TRUE) # 选择以字符x结尾的变量
- contains(x,ignore.case = TRUE) #选择所有包含x的变量
- matches(x,ignore.case = TRUE) #选择匹配正则表达式的变量
- num_range("x", 1:5, width = 2) #选择从x01到x05的数值型变量
- one_of("x", "y", "z") #选择包含在声明变量中的变量
- everything() #选择所有变量,一般调整数据集中变量顺序时使用
4.arrange--对数据的所有行排序
- # arrange按给定的列名依次对行进行排序.
- arrange(.data, ...)
- arrange_(.data, ..., .dots)
arrange 用于根据变量排序,如果排序依据(列)是字符,按照字母表的顺序,如果是数字,默认按照从小到大的顺序排序,如果需要使用逆序排,可以使用desc(var) 或者 -var。
- > arrange(df, color)
- ## color value
- ## black
- ## black
- ## blue
- ## blue
- ## blue
- > arrange(df, desc(value))
- ## color value
- ## black
- ## blue
- ## blue
- ## black
- ## blue
注意:多个排序依据直接把列名放在函数内,用逗号隔开;可以在排序里面使用计算,比如:
- arrange(flights, date, hour, minute)
- arrange(flights, desc(dep_delay - arr_delay))
5.mutate---添加新的变量
- # mutate对已有列进行数据运算并添加为新列并保存已有列和新列
- mutate(.data, ...)
- mutate_(.data, ..., .dots)
mutate 用于添加新的变量,直接使用列名进行计算得到新变量即可。而且它很有特色地方是,可以使用刚添加的变量,也就是在一个语句中可以多个变量,而且变量可以来源于刚新建的变量。
- > mutate(df, * value, quadruple = * double)
- ## color value double quadruple
- ## blue
- ## black
- ## blue
- ## blue
- ## black
6.summarise---数据汇总
- # summarise分类汇总Summarise multiple values to a single value
- summarise(.data, ...)
- summarise_(.data, ..., .dots)
summarise 可以用于“分类汇总”,但不是传统意义上的分类汇总,它还能做更多。
实际上它是把我们现有的完整 data frame 依据分组依据(这里是 color)拆分成多个data frame,然后对每个 data frame 分别计算,类似于ddply。
使用经历:分组依据可以多个,比如根据城市、月份、年份,我们对数据进行分类汇总,可以得到每个城市每一年每月的情况。
summarise 可以使用的函数有:
- min(x), median(x), max(x), quantile(x, p),IQR()等统计量
- n()返回观测个数, n_distinct()返回不同的观测个数, sum(x), mean(x)
- sum(x > 10), mean(x > 10)
- sd(x)标准差, var(x)方差, iqr(x), mad(x)
- first()返回第一个观测
- last()返回最后一个观测
- nth(x,n)返回第n个观测
- summarize(df,max(y))
- summarize(df,n())
- > by_color <- group_by(df, color) # 分组依据
- > summarise(by_color, total = sum(value)) # 分组求和
- ## Source: local data frame [ x ]
- ## color total
- ## black
- ## blue
7.rename---重命名变量
- # rename 保留所有变量keeps all variables
- rename(.data, ...)
- rename_(.data, ..., .dots)
- rename(tbl,newname = oldname,…)
示例:
- rename(dftbl,x1 = x,y1 = y)
- rename(iris, petal_length = Petal.Length)
8.group_by()---分组
以上函数已经很方便了, 但是当它们跟分组操作这个概念结合起来时, 那才叫真正的强大! 当对数据集通过 group_by() 添加了分组信息后,mutate(), arrange() 和 summarise() 函数会自动对这些 tbl 类数据执行分组操作 (R语言泛型函数的优势). group_by()函数指定tbl对象中的一个分组对象,再根据这个分组对象进行分类汇总.
例如: 对飞机航班数据按飞机编号 (TailNum) 进行分组, 计算该飞机航班的次数 (count = n()), 平均飞行距离 (dist = mean(Distance, na.rm = TRUE)) 和 延时 (delay = mean(ArrDelay, na.rm = TRUE))
- planes <- group_by(hflights_df, TailNum)
- delay <- summarise(planes,
- count = n(),
- dist = mean(Distance, na.rm = TRUE),
- delay = mean(ArrDelay, na.rm = TRUE))
- delay <- filter(delay, count > , dist < )
用 ggplot2 包作个图观察一下, 发现飞机延时不延时跟飞行距离没太大相关性:
- ggplot(delay, aes(dist, delay)) +
- geom_point(aes(size = count), alpha = /) +
- geom_smooth() +
- scale_size_area()
9.join---数据集的连接
数据框中经常需要将多个表进行连接操作,如左连接、右连接、内连接等,这里dplyr包也提供了数据集的连接操作。如下:
- inner_join #内连接 包含x及y中匹配的行
- left_join #左连接 显示所有x中以及y中匹配的行,y中不一样的赋NA
- right_join #右连接
- full_join #全连
- semi_join # 返回能够与y表匹配的x表所有记录
- anti_join # 返回无法与y表匹配的x表的所有记录
- x=data.frame(name=c("John","Paul","George","Ringo","Stuart","Pete"),
- instrument= c("guitar","guitar","drums","bass","drums","bass"))
- y=data.frame(name=c("John","Paul","George","Ringo","Brian"),
- band=c("TRUE","TRUE","TRUE","TRUE","FALSE"))
- View(x)
- View(y)
- View(left_join(x,y)) #把y表追加到x表后面
- View(inner_join(x,y))
- View(right_join(x,y))
- View(semi_join(x,y))
- View(anti_join(x,y))
- View(full_join(x,y))
10.管道操作(%>% or %.%)
将上一个函数的输出作为下一个函数的输入,%.%已废弃
示例:
Batting数据集如下:
- library(Lahman)
- Batting %>%
- group_by(playerID) %>%
- summarise(total = sum(G)) %>%
- arrange(desc(total)) %>%
- View()
- # 一种写法
- head(arrange(summarise(group_by(Batting, playerID), total = sum(G)) , desc(total)), )
- # 另一种写法
- totals <- aggregate(. ~ playerID, data=Batting[,c("playerID","R")], sum)
- ranks <- sort.list(-totals$R)
- totals[ranks[:],]
11.dplyr连接mysql数据框
如果需要获取MySQL数据库中的数据时,可以直接使用dplyr包中的src_mysql()函数:
- src_mysql(dbname,host = NULL,port = 0L,user = “root”,password = “password”,…)
示例如下:
- #dplyr连接mysql数据库
- library(dplyr)
- my_db <- src_mysql(dbname = "rmysql",
- host = localhost,
- port = ,
- user = "rmysql",
- password = "rmysql")
- my_tbl <- tbl(my_db,from = "my_table") #my_table为数据库中的表
本文链接:http://www.cnblogs.com/homewch/p/5778402.html
dplyr包--数据操作与清洗的更多相关文章
- R︱高效数据操作——data.table包(实战心得、dplyr对比、key灵活用法、数据合并)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 由于业务中接触的数据量很大,于是不得不转战开始 ...
- dplyr 数据操作 常用函数(1)
上面介绍完dplyr中,几个主要的操作函数后,我们再进一步了解dplyr中那些函数可能我们会经常要用到. 这里主要根据dplyr包作者的书籍目录来把它列出来. 1.add_rownames 添加行名称 ...
- R语言数据分析利器data.table包 —— 数据框结构处理精讲
R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代码简洁,只要一行命令就可以完成诸多任务,另一方面是处理 ...
- dplyr包
是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口:tidyr包的作者是Hadley Wickh ...
- 数据处理包plyr和dplyr包的整理
以下内容主要参照 Introducing dplyr 和 dplyr 包自带的简介 (Introduction to dplyr), 复制了原文对应代码, 并夹杂了个人理解和观点 (多附于括号内). ...
- R语言数据分析利器data.table包—数据框结构处理精讲
R语言数据分析利器data.table包-数据框结构处理精讲 R语言data.table包是自带包data.frame的升级版,用于数据框格式数据的处理,最大的特点快.包括两个方面,一方面是写的快,代 ...
- 大数据学习day39----数据仓库02------1. log4j 2. 父子maven工程(子spring项目的创建)3.项目开发(埋点日志预处理-json数据解析、清洗过滤、数据集成实现、uid回补)
1. log4j(具体见log4j文档) log4j是一个java系统中用于输出日志信息的工具.log4j可以将日志定义成多种级别:ERROR / WARN / INFO / DEBUG ...
- 柯南君 :Oracle 分区技术 之 怎样支撑大数据操作?
前段时间.看了罗女士( 资深技术顾问 - Oracle 中国 顾问咨询部)关于<大批量数据处理技术的演讲>视频.感觉受益良多,结合多年的知识积累,柯南君给大家分享一下: 交流内容: 一.O ...
- Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作
详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 这篇主 ...
随机推荐
- JS判断IE版本并在页面显示内容
<script type="text/javascript"> var isIE = function (ver) { var b = document.createE ...
- 继承下public,protected,private访问权限
C++中派生类对基类成员的访问形式主要有以下两种: 1.内部访问:由派生类中新增成员对基类继承来的成员的访问. 2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在 ...
- Linux内存性能指标、CPU性能指标
内存性能指标 内存基础概念 先执行一下 top 命令,看结果中关于内存的相关部分 # top 其中的 VIRT.RES.SWAP 都是什么呢? 分别是下面的3个概念: 物理内存 Resident - ...
- ListView + PopupWindow实现滑动删除
原文:ListView滑动删除 ,仿腾讯QQ(鸿洋_) 文章实现的功能是:在ListView的Item上从右向左滑时,出现删除按钮,点击删除按钮把Item删除. 看过文章后,感觉没有必要把dispat ...
- WinDbg 命令三部曲:(一)WinDbg 命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
- Oracle ASM
一 Oracle ASM簡介 Oracle 10g推出的管理磁盤的新方式,用於取代LVM技術.主要用于RAC環境 二 Oracle ASM的配置安裝 1.安裝asm包 RedHat Linux5.x ...
- WPF ListView展示层叠信息
通常我们在ListView中展示一列同类数据,例如城市名称.不过可以对ListView的DataTemplate稍作修改,让其显示层叠信息.例如:需要在ListView中显示省份和省份对应的城市名称. ...
- AndroidStudio创建新项目报错
创建新项目自动执行时报错: Failed to import new Gradle project: failed to find Build Tools revision 17.0.0 Consul ...
- unity3D与网页的交互---做项目的一点总结
(来自博客园) 由于项目需要,要求用unity来展示三维场景,并在三维中能够方便的查询数据库等.一开始尝试在unity中直接连接数据库,当时连的xml,然而每次发布成网页后都会出现路径找不到等问题,所 ...
- Codeforces Alpha Round #20 (Codeforces format) C. Dijkstra?(裸的dijkstra)
题目链接:http://codeforces.com/problemset/problem/20/C 思路:需要用优化过的dijkstra,提供两种写法. #include <iostream& ...