R语言基础之第六部分 分类(史上最全含ddply、aggregate、split、by)

数据:
某市2014年-2018年空气质量指数日数据,需要按年分类计算每年 warm值为1和 0的均值。
数据长这个样子:

目标:求下列的均值

一、数据处理(提取年月)

首先需要处理一下日期数据,拿到想要的年月。
这里先看一下R语言自带的 和 lubridate包的 提取季度的函数 的区别

> sjz = read.csv('C:/Users/Administrator/Desktop/简书/sjz.csv')
> head(sjz)     #读取的日期格式不是R可以处理的             date AQI quality_level PM2.5 PM10 SO2  CO NO2 O3_8h level
1    2014/1/1  85            良    46  120  98 0.9  53    56     2
2    2014/1/2 205      重度污染   155  261 221 2.5 106    23     5
3    2014/1/3 138      轻度污染   106  210 178 1.6  74    50     3
4    2014/1/4 229      重度污染   179  333 171 3.0  87    27     5
5    2014/1/5 274      重度污染   224  376 150 3.3  85    30     5
6    2014/1/6 372      严重污染   322  467 150 4.3  85    22     6> sjz$date = as.Date(sjz$date)    #R可以处理的日期格式是:y-m-d或者y/m/d
> head(sjz)date AQI quality_level PM2.5 PM10 SO2  CO NO2 O3_8h level
1 2014-01-01  85            良    46  120  98 0.9  53    56     2
2 2014-01-02 205      重度污染   155  261 221 2.5 106    23     5
3 2014-01-03 138      轻度污染   106  210 178 1.6  74    50     3
4 2014-01-04 229      重度污染   179  333 171 3.0  87    27     5
5 2014-01-05 274      重度污染   224  376 150 3.3  85    30     5
6 2014-01-06 372      严重污染   322  467 150 4.3  85    22     6

1.1 R自带函数提取年月日季度

> head(years(sjz$date))     #R自带函数提取年
[1] "16071y 0m 0d 0H 0M 0S" "16072y 0m 0d 0H 0M 0S" "16073y 0m 0d 0H 0M 0S"
[4] "16074y 0m 0d 0H 0M 0S" "16075y 0m 0d 0H 0M 0S" "16076y 0m 0d 0H 0M 0S"> head(months(sjz$date))   #R自带函数提取月
[1] "一月" "一月" "一月" "一月" "一月" "一月"> head(quarters(sjz$date))   #R自带函数提取季度
[1] "Q1" "Q1" "Q1" "Q1" "Q1" "Q1"> head(days(sjz$date))      #R自带函数提取天
[1] "16071d 0H 0M 0S" "16072d 0H 0M 0S" "16073d 0H 0M 0S" "16074d 0H 0M 0S" "16075d 0H 0M 0S"
[6] "16076d 0H 0M 0S"

1.2 lubridate包提取年月日

> library(lubridate)
> sjz$year = year(sjz$date)
> sjz$month = month(sjz$date)
> head(sjz)                #最后两列提取结果是不是就很人性date AQI quality_level PM2.5 PM10 SO2  CO NO2 O3_8h level year month
1 2014-01-01  85            良    46  120  98 0.9  53    56     2 2014     1
2 2014-01-02 205      重度污染   155  261 221 2.5 106    23     5 2014     1
3 2014-01-03 138      轻度污染   106  210 178 1.6  74    50     3 2014     1
4 2014-01-04 229      重度污染   179  333 171 3.0  87    27     5 2014     1
5 2014-01-05 274      重度污染   224  376 150 3.3  85    30     5 2014     1
6 2014-01-06 372      严重污染   322  467 150 4.3  85    22     6 2014     

1.3 生成分类变量warm

如果月份是11,12,1,2,3,则设置warm为1.其他为0

> #本行这种写法错误 sjz$warm = ifelse(sjz$month == 11|12|1|2|3,1,0),须多次使用ifelse语句,即下面这种> sjz$warm = ifelse(
+   sjz$month == 11,
+   1,
+   ifelse(
+     sjz$month == 12,
+     1,
+     ifelse(sjz$month == 1, 1, ifelse(
+       sjz$month == 2, 1, ifelse(sjz$month == 3, 1, 0)
+     ))))> head(sjz)date AQI quality_level PM2.5 PM10 SO2  CO NO2 O3_8h level year month warm
1 2014-01-01  85            良    46  120  98 0.9  53    56     2 2014     1    1
2 2014-01-02 205      重度污染   155  261 221 2.5 106    23     5 2014     1    1
3 2014-01-03 138      轻度污染   106  210 178 1.6  74    50     3 2014     1    1
4 2014-01-04 229      重度污染   179  333 171 3.0  87    27     5 2014     1    1
5 2014-01-05 274      重度污染   224  376 150 3.3  85    30     5 2014     1    1
6 2014-01-06 372      严重污染   322  467 150 4.3  85    22     6 2014     1    1

综上,我们得到了含有AQI、year、month、warm等变量的数据。这样就可以进行下面的分类了。

二、分类

2.1 使用ddply函数

ddply(data,variables,fun = NULL, …,progress = “none”,drop = TRUE, parallel = FALSE)
data : 要处理的数据框
variables :变量,以数据框的拆分,作为引用变量,公式或字符向量
drop :因变量的组合不会出现在输入数据被保存(FALSE)或下降(TRUE,默认情况下)

> library(plyr)
> a = ddply(sjz,c("year","warm"),summarise,mean = mean(AQI),length = length(AQI))
> class(a)
[1] "data.frame"
> ayear warm      mean length
1  2014    0 131.85514    214
2  2014    1 198.65972    144
3  2015    0  93.99065    214
4  2015    1 165.17361    144
5  2016    0 102.68692    214
6  2016    1 186.37500    144
7  2017    0 117.07944    214
8  2017    1 152.25694    144
9  2018    0  97.78505    214
10 2018    1 120.75694    144

2.2 使用aggregate函数:

aggregate(x,by, FUN, …, simplify = TRUE, drop = TRUE)
x : 要分类汇总的数据,可以是各种形式,包括公式形式
by : 分类依据,必须是list形式
FUN : 汇总使用的函数
simplify : 默认为TRUE,表示汇总结果以简化形式表现
drop : 默认为TRUE,表示不存在的Level组合自动舍弃

> b = aggregate(x = sjz$AQI,by = list(sjz$year,sjz$warm),FUN = mean)
> class(b)
[1] "data.frame"
> bGroup.1 Group.2         x
1     2014       0 131.85514
2     2015       0  93.99065
3     2016       0 102.68692
4     2017       0 117.07944
5     2018       0  97.78505
6     2014       1 198.65972
7     2015       1 165.17361
8     2016       1 186.37500
9     2017       1 152.25694
10    2018       1 120.75694

2.3 使用split 函数

split(x, f,drop = FALSE, …)
x : 要进行划分的数据
f : 划分的依据,可以是list,表示按list中各变量的Level组合来划分
drop : 默认为FALSE,若为TRUE,当f为list时,各变量的Level组合为空时自动舍弃这一分组

> c = split(sjz$AQI,list(sjz$year,sjz$warm))
> class(c)
[1] "list"
> sapply(c,mean)2014.0    2015.0    2016.0    2017.0    2018.0    2014.1    2015.1    2016.1    2017.1
131.85514  93.99065 102.68692 117.07944  97.78505 198.65972 165.17361 186.37500 152.25694 2018.1
120.75694

2.4 使用by函数

by(data, INDICES, FUN)
data : 数据框或矩阵
INDICES : 一个因子或因子组成的列表,定义了分组
FUN :任意函数

> d = by(sjz,list(sjz$year,sjz$warm), function(x) mean(x[,2]))
#fun这里用mean = sjz$AQI 显示错误是为啥
> class(d)
[1] "by"
> d
: 2014
: 0
[1] 131.8551
----------------------------------------------------------------------
: 2015
: 0
[1] 93.99065
----------------------------------------------------------------------
: 2016
: 0
[1] 102.6869
----------------------------------------------------------------------
: 2017
: 0
[1] 117.0794
----------------------------------------------------------------------
: 2018
: 0
[1] 97.78505
----------------------------------------------------------------------
: 2014
: 1
[1] 198.6597
----------------------------------------------------------------------
: 2015
: 1
[1] 165.1736
----------------------------------------------------------------------
: 2016
: 1
[1] 186.375
----------------------------------------------------------------------
: 2017
: 1
[1] 152.2569
----------------------------------------------------------------------
: 2018
: 1
[1] 120.7569

R语言基础之第部分:5种数据对象类型
R语言基础之第部分:操纵数据/取子集
R语言基础之第部分:重要函数apply族函数的使用
R语言基础之第部分 : 排序
R语言基础之第部分 : 总结数据信息

R语言基础之第六部分 分类(史上最全含ddply、aggregate、split、by)相关推荐

  1. C语言1013山东理工大学试题,山东理工大学史上最全C语言PPTC程序设计(2基本数据与运算).ppt...

    山东理工大学史上最全C语言PPTC程序设计(2基本数据与运算) 格式输入函数 * 格式: scanf("格式控制串",地址表) 功能:按指定格式从键盘读入数据,存入地址表指定的 存 ...

  2. 零基础怎么学测试?2022史上最全软件测试学习路线图+教程分享

    1.软件测试基础知识 >> 下载300G软测学习资料包[视频教程+PPT+课件+项目源码] 学习目标:对软件测试整理的测试流程有清晰的概念,了解软件测试到底是做什么的,软件测试的各种专业术 ...

  3. R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray、F1、偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机)

    R语言构建随机森林模型randomForest分类模型并评估模型在测试集和训练集上的效果(accuray.F1.偏差Deviance):随机森林在Bagging算法的基础上加入了列采样(分枝特征随机) ...

  4. R语言基础题及答案(六)——R语言与统计分析第六章课后习题(汤银才)

    R语言与统计分析第六章课后习题(汤银才) 题-1 有一批枪弹, 出厂时, 其初速v∼N(950,σ2)v\sim N(950,\sigma^2)v∼N(950,σ2)(单位:m/sm/sm/s). 经 ...

  5. R语言与机器学习学习笔记(分类算法)

    转载自:http://www.itongji.cn/article/0P534092014.html 人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经 ...

  6. R语言基础学习记录4:重要函数

    时间: 2018-07-18(学习) 2018-07-22(学习记录) 教程:慕课网 <R语言基础> 讲师:Angelayuan 补充内容: R语言常用函数总结大全.gl()函数 学习内容 ...

  7. R语言基础指令和并行算法初识(上篇)

    一.R语言背景介绍 二. R语言基础指令 三. R语言并行算法 四. 计划打算 一.R语言背景介绍 1.2.起源:R是统计领域广泛使用的诞生于1980年左右的S语言的一个分支.可以认为R是S语言的一种 ...

  8. 统计学习导论之R语言应用(四):分类算法R语言代码实战

    统计学习导论之R语言应用(ISLR) 参考资料: The Elements of Statistical Learning An Introduction to Statistical Learnin ...

  9. R语言基础知识入门学习(一)

    目录 系列文章目录 一.软件下载 二.基本知识 1. 对象 2. 向量 3. 向量化 4. 因子 总结 系列文章目录 R语言基础知识入门学习(一) 一.软件下载 我们可以通过这个网址对R语言软件进行下 ...

最新文章

  1. 比ewsa更快的跑包工具_重庆单肩包订购,编织布袋定做厂家
  2. python读取csv文件的方法-CSV文件在Python中的几种处理方式
  3. JQuery获取下拉列表框选中项
  4. 《英语语法新思维初级教程》学习笔记(二)名词
  5. 计算机统计字符数,如何在Word中统计相同字符(文字)出现的个数 -电脑资料
  6. 在vue-cli中搭建mock服务器
  7. php查询socket数据包头,php 查询数组值php中关于socket的系列函数总结
  8. GPU Gems1 - 8 衍射的模拟
  9. 玩转Javascript 给JS写测试
  10. mysql解压安装如何登录_如何安装windows解压版MySQL及开启报错
  11. 19款探岳刷隐藏教程_三星S10系列如何隐藏导航栏 官微“手把手”教你设置
  12. oracle merge
  13. 对象可以创建数组吗_电脑零基础可以学习创建网站吗?
  14. 前端学习与“IT界大佬告诉你,程序员接私活的7大平台利器”
  15. Leetcode 133.克隆图
  16. Android中R文件的丢失问题以及aapt.exe停止工作如何解决
  17. Linux教程系列-命令大全
  18. 域名解析地址如何查看?为什么要做域名解析?
  19. 同居mm_倾向于同居
  20. 课堂纪律一团糟老师应该怎么办?

热门文章

  1. Python调用PHP的函数
  2. 【Java并发】Java并发编程-02
  3. LaTex\TexStudio 数学矩阵
  4. MATLAB中repmat函数用法
  5. 麦克风阵列杂音很重解决方案(科大讯飞麦克风阵列+6.0)
  6. BZOJ4768: 2555加强版之wxh loves substring
  7. 中职计算机说课教法,2015教师资格证面试高中美术中职公共艺术美术篇说课稿 平面构成中的形象—活泼的点...
  8. Gradle 2.0 用户指南翻译——第五十章. 依赖管理
  9. 记getsockopt有时偶然返回为零的异常
  10. 铣床是什么?怎么分类