R语言 tidyverse 之数据处理:dplyr (中)
在 dplyr 中使用 summarize 函数进行数据汇总时,通常要结合分组函数 group_by 一起使用。
1. group_by:分组函数
group_by 一般会和 mean、sum、max、min、median 等函数一起使用,对数据进行分组汇总,可以同时处理多个字段。
library(dplyr)
library(gapminder)# 按 year 字段分组, 统计 lifeExp 的均值、对 pop 求和
gapminder %>%group_by(year) %>%summarize(mean_lifeExp = mean(lifeExp),total_pop = sum(pop))# 按 year、continent 字段分组,统计 lifeExp 的中位数、pop 的最大值、gdpPercap 的最小值
gapminder %>%group_by(year, continent) %>%summarize(median_lifeExp = median(lifeExp),max_pop = max(pop),min_gdpPercap = min(gdpPercap))
2. count:计数函数
count 函数可以直接统计一个或多个字段分组后的个数,默认会新增一个列名为 n 的字段来表示统计结果,可以使用 name 参数重命名该字段,sort = TRUE 会按个数降序排。
# 按 year 分组计数
gapminder %>% count(year)# 按 year、continent 分组计数,并降序排
gapminder %>% count(year, continent, name = 'cnt', sort = TRUE)
当然也可以使用 group_by 和 summarise 函数实现上述计数的统计,此时需使用 n() 函数,有时候我们需要去重计数,实现类似于 count distinct 的功能,这时可以使用 n_distinct 函数。
# 按 year 分组计数, 与 count 等价
gapminder %>% group_by(year) %>%summarise(n = n())# 按 year、continent 分组计数, 并降序排, 与 count 等价
gapminder %>% group_by(year, continent) %>%summarise(cnt = n()) %>%arrange(desc(cnt))# 分组去重计数,按 year 分组,去重统计 continent 的个数
# 类似于 select year, count(distinct continent) from table group by year
gapminder %>% group_by(year) %>%summarise(n = n_distinct(continent))
3. 排序函数
dplyr 中的排序函数和 SQL 类似,有 row_number、rank 和 dense_rank 三种,特别注意的是 rank 函数,在 dplyr 包中的写法是 min_rank 而不是 rank,其他两个函数的名称和 SQL 一致,三者的区别如下:
- row_number:相同值排序不重复
- dense_rank:相同值排序重复,排序连续
- min_rank:相同值排序重复,排序不连续
library(tibble)
# 新建一个 tibble 数据框
student_df <- tibble(name = c('张三', '李四', '王五', '赵六', '孙七', '周八', '吴九'),score = c(85, 83, 96, 92, 96, 95, 92)
)# row_number 排序, 相同值不会重复
student_df %>%mutate(asc_order = row_number(score),desc_order = row_number(desc(score)))# dense_rank 排序, 相同值重复且排序连续
student_df %>%mutate(asc_order = dense_rank(score))# min_rank 排序, 相同值重复且排序不连续
student_df %>%mutate(asc_order = min_rank(score))
row_number 排序结果:
dense_rank 排序结果:
min_rank 排序结果:
4. slice 系列函数
4.1 slice、slice_head、slice_tail 函数
slice 的中文含义是切片,所以该函数的功能可以理解为从数据框中选择部分数据,使用起来比较简单。
# 第10行
gapminder %>% slice(10)# 第1000行到最后一行
gapminder %>% slice(1000:n())# 前5行
gapminder %>% slice_head(n = 5)# 后5行
gapminder %>% slice_tail(n = 5)
4.2 slice_max、slice_min 函数
分组查询每组的前n个值,是我们统计排行榜数据时经常需要用到的,比如电商中每个品类销量前10的商品。
早期版本的 dplyr 包,是用 top_n 函数来统计最大或最小的前 n 个值,其中 n 为正数表示最大的 n 个值,n 为负数表示最小的 n 个值。
# pop 字段最大的3个
gapminder %>% top_n(pop, n = 3)# 按 continent 分组,查询每组 pop 字段最大的3个
gapminder %>%group_by(continent) %>%top_n(pop, n = 3)# pop 字段最小的3个
gapminder %>% top_n(pop, n = -3)
最新版本的 dplyr 包,则使用 slice_max、slice_min 来统计最大或最小的前 n 个值,top_n 在之后的版本中会慢慢废弃,所以还是建议大家使用 slice_max 和 slice_min 函数。
和 top_n 函数相比,slice_max、slice_min 默认会排序,其他的则没有区别。
# pop 字段最大的3个, 从大到小排序
gapminder %>% slice_max(pop, n = 3)# 按 continent 分组,查询每组 pop 字段最大的3个
gapminder %>%group_by(continent) %>%slice_max(pop, n = 3)# pop 字段最小的3个, 从小到大排序
gapminder %>% slice_min(pop, n = 3)
top_n 取 pop 字段最大的前 3 个:
slice_max 取 pop 字段最大的前 3 个,会默认按 pop 值排序:
当然,上述功能,我们也可以结合已经学习过的 mutate、row_number 等函数来实现。
# 分组查询每个continent的前3
gapminder %>%group_by(continent) %>%slice_max(pop, n = 3) %>%arrange(continent, desc(pop))# 分组查询每个continent的前3, 使用排序函数 row_number 实现
gapminder %>%group_by(continent) %>%mutate(rank_order = row_number(desc(pop))) %>%filter(rank_order <= 3) %>%select(-rank_order) %>%arrange(continent, desc(pop))
4.3 slice_sample:抽样函数
早期版本的 dplyr 包,是用 sample_n、 sample_frac 函数来随机抽样的。
# 按个数抽样, 抽 10 个
gapminder %>% sample_n(10)# 按比例抽样, 抽总体的 10%
gapminder %>% sample_frac(0.1)
最新版本的 dplyr 包,建议大家使用 slice_sample 来进行抽样,而 sample_n、sample_frac 在之后的版本中会慢慢废弃。
# 按个数抽样
gapminder %>% slice_sample(n = 10)# 按年份分组抽样, 每年随机抽2个样本
gapminder %>% group_by(year) %>%slice_sample(n = 2)# 按比例抽样
gapminder %>% slice_sample(prop = 0.1)
5. lead、lag:偏移函数
# 向前偏移
student_df %>% mutate(lead_pop = lead(score))# 向前偏移2个步长
student_df %>% mutate(lead_pop = lead(score, n = 2))# 向后偏移
student_df %>% mutate(lead_pop = lag(score))
向前偏移 1 位,则最后一行 lead_pop 的值为 NA:
向后偏移1位,则第一行 lead_pop 的值为 NA:
下一节,我们会介绍 dplyr 中不同数据框的连接操作,类似于 SQL 中的 join。
R语言 tidyverse 之数据处理:dplyr (中)相关推荐
- 大数据分析R语言tidyverse数据清洗工具教程
凌乱的数据集无处不在.如果要分析数据,不可避免地需要清理数据.在大数据分析R语言tidyverse数据清洗工具教程中,我们将研究如何使用R和一些漂亮的tidyverse工具来做到这一点. 该tidyv ...
- r语言提取列名_玩转数据处理120题之P1-P20(R语言tidyverse版本)
前言 今天在微信公众号[早起Python],看到有篇文章叫做[玩转数据处理120题],最初来自[Pandas进阶修炼120题],作者刘早起开始是用pandas实现的,后来又加入了中山大学博士陈熹的R语 ...
- R语言在气象、水文中数据处理及结果分析、绘图
R语言是一门由统计学家开发的用于统计计算和作图的语言(a Statistic Language developed for Statistic by Statistician),由S语言发展而来,以统 ...
- r语言必学的十个包肖凯_30 天学会R DAY 14:R语言必学包dplyr
原标题:30 天学会R DAY 14:R语言必学包dplyr 第14天 R语言必学包dplyr R语言非常讲究数据的整理,我们在7-13天的R语言学习内容中,着重都是关于R语言的整理,各种方法对数据进 ...
- R语言计算资本资产定价模型(CAPM)中的Beta值和可视化
原文链接:http://tecdat.cn/?p=22588 今天我们将计算投资组合收益的CAPM贝塔.这需要拟合一个线性模型,得到可视化,从资产收益的角度考虑我们的结果的意义. 简单的背景介绍,资本 ...
- R语言str_trim函数去除字符串中头部和尾部的空格
R语言str_trim函数去除字符串中头部和尾部的空格 目录 R语言str_trim函数去除字符串中头部和尾部的空格 #导入包和库 #仿
- R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体)
R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置x轴的标签文本使用粗体字体) 目录
- R语言ggplot2在可视化图像中添加横线并在横线中添加文本、为横线中添加的文本添加文本框、自定义文本框的填充色(background color for a text annotation)
R语言ggplot2在可视化图像中添加横线并在横线中添加文本.为横线中添加的文本添加文本框.自定义文本框的填充色(background color for a text annotation) 目录
- R语言str_extract函数从字符串中抽取匹配模式的字符串
R语言str_extract函数从字符串中抽取匹配模式的字符串 目录 R语言str_extract函数从字符串中抽取匹配模式的字符串 #导入包和库
最新文章
- 【转载】关于对方法实例化的相关感悟以及unity的50个技巧
- JavaScript 回调(callback)函数
- Spring框架—IoC容器
- 华为发布基于自进化AI的HiSec Insight安全态势感知系统
- 检察日报:需从预防犯罪视角对私人数字货币实施刑法规制
- 关于自然语言处理,数据科学家需要了解的 7 项技术
- 程序代码移植和烧录需要注意什么_牙齿矫正需要注意什么?
- C# 特性(Attribute)之Flag特性
- 使用java自带工具监控jvm运行状态
- 《OpenCV算法精解——基于Python与C++》第七章形态学处理
- linux 笔记本 显卡驱动下载地址,AMD Radeon HD系列Linux显卡驱动13.9版下载
- 伪代码是计算机语言的一种吗,伪代码是什么?可以取代代码存在吗?
- cmd修改dns服务器,如何通过cmd修改dns图解教程
- 复杂网络——活跃度驱动模型(activity-driven model)原理及算法实现
- VS2017调试程序提示脚本错误解决方法
- ARP命令详解和解决ARP攻击
- 孙子兵法始计篇读后感&心得(下)
- 街头篮球服务器未响应,我的生涯我做主 《街头篮球》生涯联赛FAQ
- Python爬虫之使用正则表达式匹配网页内容
- Entity Framework入门
热门文章
- python白鹅类型_关于python鸭子类型和白鹅类型
- 项目部署到Linux服务器上 (全)linux服务器安装java mysql 配置
- 微信开发--获取用户信息 48001 问题
- 理解Spring面向接口编程思想
- 关于移动端页面滑动报错 [InterUnableUnable to preventDefault inside passive或 fastclick.js:446 [InterUn :
- vue + elemen可远程搜索select选择器的封装(思路及源码分享)
- [题集]Lecture 4. Leftist Heaps and Skew Heaps
- java对象头 MarkWord
- dubbo-dubbo spi详解
- 迟到的年终总结,2012-2014