R语言中的数据处理包dplyr、tidyr笔记
R语言中的数据处理包dplyr、tidyr笔记
dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口;tidyr包的作者是Hadley Wickham, 该包用于“tidy”你的数据,这个包常跟dplyr结合使用。
本文将介绍dplyr包的下述五个函数用法:
- 筛选: filter()
- 排列: arrange()
- 选择: select()
- 变形: mutate()
- 汇总: summarise()
- 分组: group_by()
以及tidyr包的下述四个函数用法:
- gather—宽数据转为长数据;
- spread—长数据转为宽数据;
- unit—多列合并为一列;
- separate—将一列分离为多列;
dplyr、tidyr包安装及载入
install.packages("dplyr")
install.packages("tidyr")
library(dplyr)
library(tidyr)
使用datasets包中的mtcars数据集做演示,首先将过长的数据整理成友好的tbl_df数据:
mtcars_df = tbl_df(mtcars)
dplyr包基本操作
1.1 筛选: filter()
按给定的逻辑判断筛选出符合要求的子数据集
filter(mtcars_df,mpg==21,hp==110)
# A tibble: 2 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 21 6 160 110 3.9 2.620 16.46 0 1 4 4
2 21 6 160 110 3.9 2.875 17.02 0 1 4 4
1.2 排列: arrange()
按给定的列名依次对行进行排序:
arrange(mtcars_df, disp) #可对列名加 desc(disp) 进行倒序
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
2 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
3 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
4 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
5 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
6 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
7 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
8 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
9 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
10 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
# ... with 22 more rows
1.3 选择: select()
用列名作参数来选择子数据集:
select(mtcars_df, disp:wt)
# A tibble: 32 x 4
disp hp drat wt
* <dbl> <dbl> <dbl> <dbl>
1 160.0 110 3.90 2.620
2 160.0 110 3.90 2.875
3 108.0 93 3.85 2.320
4 258.0 110 3.08 3.215
5 360.0 175 3.15 3.440
6 225.0 105 2.76 3.460
7 360.0 245 3.21 3.570
8 146.7 62 3.69 3.190
9 140.8 95 3.92 3.150
10 167.6 123 3.92 3.440
# ... with 22 more rows
1.4 变形: mutate()
对已有列进行数据运算并添加为新列:
mutate(mtcars_df,
NO = 1:dim(mtcars_df)[1])
# A tibble: 32 x 12
mpg cyl disp hp drat wt qsec vs am gear carb NO
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 1
2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 2
3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 3
4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 4
5 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 5
6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 6
7 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 7
8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 8
9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 9
10 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 10
# ... with 22 more rows
1.5 汇总: summarise()
对数据框调用其它函数进行汇总操作, 返回一维的结果:
summarise(mtcars_df,
mdisp = mean(disp, na.rm = TRUE))
# A tibble: 1 x 1
mdisp
<dbl>
1 230.7219
1.6 分组: group_by()
当对数据集通过group_by()添加了分组信息后,mutate(),arrange() 和 summarise() 函数会自动对这些 tbl 类数据执行分组操作。
cars <- group_by(mtcars_df, cyl)
countcars <- summarise(cars, count = n()) # count = n()用来计算次数
# A tibble: 3 x 2
cyl count
<dbl> <int>
1 4 11
2 6 7
3 8 14
tidyr包基本操作
2.1 宽转长:gather()
使用gather()函数实现宽表转长表,语法如下:
gather(data, key, value, …, na.rm = FALSE, convert = FALSE)
data:需要被转换的宽形表
key:将原数据框中的所有列赋给一个新变量key
value:将原数据框中的所有值赋给一个新变量value
…:可以指定哪些列聚到同一列中
na.rm:是否删除缺失值
widedata <- data.frame(person=c('Alex','Bob','Cathy'),grade=c(2,3,4),score=c(78,89,88))
widedata
person grade score
1 Alex 2 78
2 Bob 3 89
3 Cathy 4 88
longdata <- gather(widedata, variable, value,-person)
longdata
person variable value
1 Alex grade 2
2 Bob grade 3
3 Cathy grade 4
4 Alex score 78
5 Bob score 89
6 Cathy score 88
2.2 长转宽:spread()
有时,为了满足建模或绘图的要求,往往需要将长形表转换为宽形表,或将宽形表变为长形表。如何实现这两种数据表类型的转换。使用spread()函数实现长表转宽表,语法如下:
spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)
data:为需要转换的长形表
key:需要将变量值拓展为字段的变量
value:需要分散的值
fill:对于缺失值,可将fill的值赋值给被转型后的缺失值
mtcarsSpread <- mtcarsNew %>% spread(attribute, value)
head(mtcarsSpread)
car am carb cyl disp drat gear hp mpg qsec vs wt
1 AMC Javelin 0 2 8 304 3.15 3 150 15.2 17.30 0 3.435
2 Cadillac Fleetwood 0 4 8 472 2.93 3 205 10.4 17.98 0 5.250
3 Camaro Z28 0 4 8 350 3.73 3 245 13.3 15.41 0 3.840
4 Chrysler Imperial 0 4 8 440 3.23 3 230 14.7 17.42 0 5.345
5 Datsun 710 1 1 4 108 3.85 4 93 22.8 18.61 1 2.320
6 Dodge Challenger 0 2 8 318 2.76 3 150 15.5 16.87 0 3.520
2.3 合并:unit()
unite的调用格式如下:
unite(data, col, …, sep = “_”, remove = TRUE)
data:为数据框
col:被组合的新列名称
…:指定哪些列需要被组合
sep:组合列之间的连接符,默认为下划线
remove:是否删除被组合的列
wideunite<-unite(widedata, information, person, grade, score, sep= "-")
wideunite
information
1 Alex-2-78
2 Bob-3-89
3 Cathy-4-88
2.4 拆分:separate()
separate()函数可将一列拆分为多列,一般可用于日志数据或日期时间型数据的拆分,语法如下:
separate(data, col, into, sep = “[^[:alnum:]]+”, remove = TRUE,
convert = FALSE, extra = “warn”, fill = “warn”, …)
data:为数据框
col:需要被拆分的列
into:新建的列名,为字符串向量
sep:被拆分列的分隔符
remove:是否删除被分割的列
widesep <- separate(wideunite, information,c("person","grade","score"), sep = "-")
widesep
person grade score
1 Alex 2 78
2 Bob 3 89
3 Cathy 4 88
可见separate()函数和unite()函数的功能相反。
R语言中的数据处理包dplyr、tidyr笔记的更多相关文章
- R语言中的机器学习包
R语言中的机器学习包 Machine Learning & Statistical Learning (机器学习 & 统计学习) 网址:http://cran.r-project ...
- r语言,安装外部包 警告: 无法将临时安装
安装R语言中的外部包时,出现错误提示 试开URL’https://mirrors.tuna.tsinghua.edu.cn/CRAN/bin/windows/contrib/3.3/ggplot2_2 ...
- R+openNLP︱openNLP的六大可实现功能及其在R语言中的应用
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- openNLP是NLP中比较好的开源工具,R语 ...
- R语言中的字符处理
R语言中的字符处理 (2011-07-10 22:29:48) 转载▼ 标签: r语言 字符处理 字符串 连接 分割 分类: R R的字符串处理能力还是很强大的,具体有base包的几个函数和strin ...
- R语言中样本平衡的几种方法
R语言中样本平衡的几种方法 在对不平衡的分类数据集进行建模时,机器学习算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带有误导性.在不平衡的数据中,任一算法都没法从样本量少的类中获取 ...
- R语言中动态安装库
R语言中动态安装库 在一个R脚本中,我们使用了某些library,但是发现运行环境中没有这个library,如果能检测一下有没有这个包,没有就自动安装该多好.而R中非常方便地支持这些,只要联网. 代码 ...
- 机器学习:R语言中如何使用最小二乘法
详细内容见上一篇文章:http://www.cnblogs.com/lc1217/p/6514734.html 这里只是介绍下R语言中如何使用最小二乘法解决一次函数的线性回归问题. 代码如下:(数据同 ...
- R语言中的横向数据合并merge及纵向数据合并rbind的使用
R语言中的横向数据合并merge及纵向数据合并rbind的使用 我们经常会遇到两个数据框拥有相同的时间或观测值,但这些列却不尽相同.处理的办法就是使用merge(x, y ,by.x = ,by.y ...
- R语言中数据结构
R语言还是有点古老感觉,数据结构没有Python中那么好用.以下简单总结一下R语言中经常使用的几个数据结构. 向量: R中的向量能够理解为一维的数组,每一个元素的mode必须同样,能够用c(x:y)进 ...
随机推荐
- 简述Android触摸屏手势识别
很多时候,利用触摸屏的Fling.Scroll等Gesture(手势)操作来操作会使得应用程序的用户体验大大提升,比如用Scroll手势在 浏览器中滚屏,用Fling在阅读器中翻页等.在Android ...
- iOS - TouchLock 手势锁
1.绘制手势锁 具体实现代码见 GitHub 源码 QExtension QTouchLockView.h @interface QTouchLockView : UIView /// 提示信息框 @ ...
- Linux内核同步 - 原子操作
一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个位于memory中的变量的值到寄存器中 2.修改该变量的值(也就是修改寄存器中的值) 3.将寄存器中的数值写回memory中的变量值 如果这 ...
- CListCtrl获取列数
CListCtrl获取列数 // m_List是一个CListCtrl CHeaderCtrl* pHeaderCtrl = m_List.GetHeaderCtrl();if(pHeaderCtrl ...
- POJ 2299:Ultra-QuickSort
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 39397 Accepted: 14204 ...
- win7下安装ubuntu双系统的方法及心得体会(ps:要死好几回的节奏)
1.win7下安装ubuntu系统后,可以很好进入ubuntu系统 但是进不去win7,开机有win7选项,但是选择后不管用 方法思路:各种修复win7的mbr 我的问题是:在winpe中发现,根本看 ...
- springboot admin
转 Spring Boot Admin的使用 作者 杜琪 关注 2015.12.25 17:30* 字数 1803 阅读 16569评论 21喜欢 55 上一篇文章中了解了Spring Boot提供的 ...
- Vim下的插件管理工具pathogen简介
1.pathogen简介: 通常情况下安装vim插件是将所有的插件和相关的doc文件都安装在一个文件夹中,如$VIM/vim74/plugin目录下,文档在$VIM/vim74/doc目录下,但 ...
- linux进程 kipmi0
top 发现负载很低,没有连接的时候,一个进程经常跳到最前面,用户是root, 命令是 kipmi0 , 后来查询了一下,很可能 是外部设备要使用到的 IPMI , 智能型平台管理接口(Intell ...
- c# 获取当前程序运行根目录
//获取绝对路径,调用如 string fileName = string.Format("~/RuleConfigFiles/Campaign_{0}.JSON", Campai ...