【技巧】如何快速按照日期分组
时间:2022-07-28
本文章向大家介绍【技巧】如何快速按照日期分组,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题的提出
在处理数据的时候,我们常常需要按照日期对数据进行分类汇总,例如每周、每月、每年汇总等。常见的做法是建立一个用于分类的变量,然后再按照这个变量进行汇总。然而这种做法特别麻烦,因为我们常常要尝试多种不同的分类长度,很难事先就一次性创建好用于分类的变量。
再次,这种常规方法很难处理一些不规则的日期间隔,例如我希望每隔3天对数据汇总一次;或者再变态一点,我希望把数据分成两组:一组是周三,另一组是非周三。遇到这种情况,我们该怎么办呢?
本期大猫将教大家使用 data.table
包的 keyby
语句完成上述任务。使用 data.table
的好处是:
- 不需要事先创建分类变量,啥时想分类了,直接分就可以(group on the fly)
- 速度特别、特别快!
- 代码非常、非常简洁!(也就十几个字符!)
注:文章中所有代码块都可以水平滚动!不信滑滑看?
实战操作
生成样例数据集
首先我们生成一个样例数据集:
# 生成 100 个日期,从2018-01-01开始
set.seed(42)
n <- 100
dt <- data.table(date = seq(ymd("2018-01-01"), length.out = n, by = "day"), x = runif(n))
生成的数据集长这个样子:
按照周进行分类
如果我们想要每周对变量 x
求均值,只要在 keyby
语句中指定 week=week(date)
即可:
# 按照周进行分组
dt[, .(x = mean(x)), keyby = .(week = week(date))]
结果如下图:
按照星期进行分类
如果想要按照星期(周一到周日)分类,只要把 week
函数改成 wday
即可:
# 按照星期进行分组
res <- dt[, .(x = mean(x)), keyby = .(weekday = wday(date))]
结果如下图:
按照“是否为周三”进行分类
如果我们想把样本分成两组,一组是周三(True),一组是非周三(False),则只要使用 wday(date)==3
来生成一列值为 True
或者 False
的向量就行。
# 按照是否为“周三”进行分组:“True”即周三,“False”即除周三以外的任何日期
dt[, .(x = mean(x)), keyby = .(is.wed = wday(date) == 3)]
结果如下:
按照“每个三天”分类
为了按照任意间隔进行分类,我们需要用到 data.table
包中的 ceiling_date
函数。在下面的代码中, ceiling_date(date,"3 days")
含义是每三天对 date
进行一次“四舍五入”。
# 按照“每3天”进行分组
dt[, .(x = mean(x)), keyby = .(three.day = ceiling_date(date, "3 days"))]
大家注意观察最后的结果,是不是每个三天才产生一个输出?
(完)
长按二维码关注
- 使用MyBatis轻松实现递归查询与存储过程调用
- Config Server——使用Spring Cloud Bus自动刷新配置
- Config Server——配置内容的加密与解密 详解
- 使用 HTML5 WebSocket 构建实时 Web 应用
- Mysql group by实现方式(一) - 临时表
- TensorFlow 入门
- Python 爬虫 1 快速入门
- Exim Off-by-one(CVE-2018-6789)漏洞复现分析
- 一文学会用 Tensorflow 搭建神经网络
- 数据降维处理:PCA之特征值分解法例子解析
- 理解Eureka的自我保护模式
- 如何使用Feign构造多参数的请求
- 最简日志打印规范
- 碎片化 | 第四阶段-47-值栈细节问题-视频
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- android实现记住用户名和密码以及自动登录
- Android碎片fragment实现静态加载的实例代码
- android异步消息机制 源码层面彻底解析(1)
- /undefinedcss/modules/layer/default/layer.css?v=3.1.1找不到的问题
- Android实现渐变启动页和带有指示器的引导页
- the input device is not a TTY. If you are using mintty, try prefixing the comma
- 【STM32F407】第13章 RL-TCPnet V7.X之创建多个TCP客户端
- RecyclerView实现列表倒计时
- wsl设置默认账户为root(ubuntu18.04)
- LeetCode No.14 最长公共前缀
- android异步消息机制 从源码层面解析(2)
- beego解决跨域问题:options请求、axios post请求跨域问题
- Android ListView列表实现倒计时
- [-Flutter 自组篇-] 蛛网图+绘制+动画实践
- Kotlin类型系统竟如此简单