r学习笔记第五篇:数据变换和清理

悦光阴 悦光阴     2022-10-01     730

关键词:

在使用R的分组操作之前,首先要了解R语言包,包实质上是实现特定功能的,预先写好的代码库(library),R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量的,在使用包之前,最好导社区中了解其他网友的反馈。

安装包,引用包和卸载包的命令分别是:

install.packages("package-name")
library(package-name)
remove.packages("package-name")

数据分析的工作,80%的时间耗费在处理数据上,而数据处理的过程可以分为:分离-操作-结合(Split-Apply-Combine),也就是说,先将数据根据特定的字段分组,每个分组都是独立的;然后,对每个分组执行转换,最后把转换后的结果组合在一起,在数据处理中,经常需要循环访问数据,R语言是矢量化的,天生具有处理循环操作的优势。

一,分组聚合

在apply函数家族中,apply函数只能用于矩阵,lapply函数能够用于向量和列表(list),其工作原理是把一个函数应用于一个列表中的每个元素上,并且把结果作为列表返回;sapply处理列表,返回向量。mapply函数,把调用的函数应用到多个列表的每一个元素中。

tapply函数用于分组聚合运算,在研究数据时,有时需要对数据按照特定的字段进行分组,然后统计各个分组的数据,这就是SQL语法中的分组聚合。在R语言中,可以通过三步实现:拆分-应用-合并(Split-Apply-Combine)

例如,对玩家的游戏成绩进行统计和分析,创建示例数据:

> players_scores=data.frame(
+     player=rep(c(‘Tom‘,‘Dick‘,‘Jim‘),times=c(2,5,3)),
+     score=round(runif(10,1,100),-1)
+ )

计算每个玩家的平均得分,首先对玩家分组,split函数的作用是按照特定的字段对数据框进行分组,第一个参数是数据框对象,第二个参数是分组字段,split函数返回的结果是列表对象。

例如,split(score,player)函数的作用是按照player字段把数据框中的score拆分成一组,也就是说,player 相同的score是同一个分组,填充到同一个列表项中:

> (scores_by_player=with(players_scores,split(score,player)))
$Dick
[1] 70 20 30 70 70

$Jim
[1] 80 90 50

$Tom
[1] 80 90

第二步是对每个分组计算平均分,利用lapply函数,把函数引用于列表的每个列表项中:

list_mean_by_player=lapply(scores_by_player,mean)

第三步是把结果合并到单个向量中,也就是把列表转换成向量,

> unlist(list_mean_by_player)
    Dick      Jim      Tom 
52.00000 73.33333 85.00000 

在数据分析中,”拆分-应用-合并“ 显示十分繁琐,tapply函数一次完成所有的三个步骤,一气呵成:

with(players_scores,tapply(score,player,mean))

tapply函数常用的参数共有三个,第一个参数是:数据框对象或向量,第二个参数是因子列表,也就是分组字段,第三个参数是指对单个分组应用的函数变量:

tapply(X, INDEX, FUN = NULL, ...)

by函数和aggregate函数是tapply函数的包装函数,功能相同,接口稍微不同。

二,aggregate函数

aggregate函数把数据分离为单独的子集,为每一个子集计算聚合值,然后把聚合值结合(combine)在一起返回。aggregate函数第一个参数是:price~cut,这是formula对象,包括符号“ ~”,以及在符号“~”两侧的变量,左侧代表要计算聚合值的变量(聚合变量),右侧代表分组的变量,函数依据分组变量,把数据分离为多个单独的子集。第二个参数是操作的数据框,第三个参数是应用在符号“~”左侧的函数,例如:

> library(ggplot2)
> data("diamonds")

data函数的作用是加载指定的数据集,本例将加载ggplot2包中的diamonds数据集,这个数据集在下文直接引用。

使用aggregate函数操作diamonds数据集,按照cut字段分组,函数mean的作用是为每个分组计算prince的平均值:

> aggregate(price~cut,diamonds,mean)

aggregate函数能够添加多余一个的分组变量,只需要在formula右侧添加变量,并用加号“+”隔离:

> aggregate(price~cut+color,diamonds,mean)
         cut color    price
1       Fair     D 4291.061
2       Good     D 3405.382
3  Very Good     D 3470.467
....

aggregate函数能够添加多个聚合变量,只需要在formula左侧,使用函数cbind把两个变量组合起来:

> aggregate(cbind(price,carat)~cut,diamonds,mean)
        cut    price     carat
1      Fair 4358.758 1.0461366
2      Good 3928.864 0.8491847
3 Very Good 3981.760 0.8063814
4   Premium 4584.258 0.8919549
5     Ideal 3457.542 0.7028370

还可以在aggregate函数formular对象的两侧分别添加多个变量执行操作

> aggregate(cbind(price,carat)~cut+color,diamonds,mean)
         cut color    price     carat
1       Fair     D 4291.061 0.9201227
2       Good     D 3405.382 0.7445166
....

三,plyr包

plyr包基本上可以取代apply函数家族,plyr包核心函数的特点是:**ply,所有的函数名都由5个字符组成,且最后三个字符是ply,函数名的第一个字符代表输入值的类型,第二个字符代表输出值的类型。类型简写是:

  • d:data.frame
  • l:list
  • a:array,vector,matrix
  • r:代表replicate
  • _:舍弃输出结果

plyr包的核心函数,使用起来十分方便,使用之前,需要加载和引用plyr包:

install.packages("plyr")
library(plyr)

1,ddply函数

plyr包中最常用的函数是ddply函数,函数的第一个参数是要操作的数据框,第二个参数是:要进行拆分的列的名称,第三个参数是要应用到每个元素上的函数。传递列时,无需引号,但是需要包含在.(col_name)的调用之后。

使用colwise函数,使ddply函数把第三个参数引用于每一列,除了第二个参数指定的数据列之外,或者使用summarize函数对指定的列执行操作:

> ddply(diamonds,.(color),summarize,avg_price=mean(price),avg_carat=mean(carat))
  color avg_price avg_carat
1     D  3169.954 0.6577948
2     E  3076.752 0.6578667
.....

2,each函数

each函数,能够使函数aggregate函数同时调用多个函数

> aggregate(cbind(price,carat)~cut+color,diamonds,each(mean,sum))
         cut color   price.mean    price.sum   carat.mean    carat.sum
1       Fair     D     4291.061   699443.000    0.9201227  149.9800000
2       Good     D     3405.382  2254363.000    0.7445166  492.8700000
......

三,dplyr包

dplyr包只能用于tibble类型的对象,用于对数据进行数据清理和转换,使用以下命令加载和引用dplyr包:
install.packages("dplyr")
library(dplyr)

tibble 类型是dplyr包特有的对象类型(data frame tbl / tbl_df)。在利用dplyr包处理数据之前,首先需要把数据框装载成tibble类型,可以调用 tbl_df函数把数据框类型的数据装载成 tibble 类型的数据对象:

> df=tbl_df(diamonds)

1,投影函数(select)

从tibble变量中,选择特定的数据列显示,select函数的第一个参数是tibble变量:

> select(df,carat,cut,color)

2,筛选函数(filter)

从tibble变量中,按照特定的条件过滤数据:

> filter(df,color==E)

3,转换函数(mutate)

根据tibble变量中的数据,应用指定的公式,派生新的数据列,或重写已经存在的数据列:

> mutate(df,avg_ct=price/carat)

4,汇总函数(summarize)

对tibble变量执行聚合运算,如果tibble已经被分组,那么单独对每个分组进行聚合运算:

> summarize(df,avg_prince=mean(price),avg_ct=mean(carat))

5,分组函数(group_by)和移除分组(ungroup)

被分组之后,tibble变量处于分组状态,可以使用ungroup函数,移除tibble变量的分组状态。

group_by(df,color)

6,管道操作符(%>%)

管道操作符(%>%)用于把前一步操作的结果集(变量类型是tibble)传递到下一个函数中,赋值给函数的第一个参数中:

> group_by(df,color) %>% summarize(mean(price))
# A tibble: 7 x 2
  color `mean(price)`
  <ord>         <dbl>
1     D      3169.954
2     E      3076.752
3     F      3724.886
4     G      3999.136
5     H      4486.669
6     I      5091.875
7     J      5323.818

7,排序函数(arrange)

arrange对tibble变量进行排序,默认是按照字段的升序值排序,使用desc(field),可以按照字段的降序值排序:

> group_by(df,color) %>% summarize(avg_price=mean(price)) %>% arrange(desc(avg_price))

 

参考文档:

R语言滴水穿石系列文章(一):dplyr-高效的数据变换与整理工具

dplyr Package

小白入门深度学习|第五篇:数据不均衡的处理方法

前言: 查看详情

python学习第五篇:操作mysql数据库(代码片段)

​Python学习第五篇:操作MySQL数据库活动地址:CSDN21天学习挑战赛python操作MySQL数据库,要先安装第三方库pymysql命令行pipinstallpymysql或pycharm里的setting设置里添加库——操作数据库基本流程与数据库创建连接获取游标通... 查看详情

python学习第五篇:操作mysql数据库(代码片段)

​Python学习第五篇:操作MySQL数据库活动地址:CSDN21天学习挑战赛python操作MySQL数据库,要先安装第三方库pymysql命令行pipinstallpymysql或pycharm里的setting设置里添加库——操作数据库基本流程与数据库创建连接获取游标通... 查看详情

django学习~第五篇

一简介:之前我们都是大概了解了下django本身和一些基本功能这次我们深入一些聊    model模块此处不考虑外键等特殊情况    今天来实现用户注册界面    1常见的具体字段介绍  &n... 查看详情

#java学习之路——基础阶段二(第五篇)

我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容。前言:此随笔主要是J... 查看详情

第五篇pandas??

pandas含有使数据清洗和分析?作变得更快更简单的数据结构和操作?具。pandas经常和其它?具?同使?,如数值计算?具NumPy和SciPy,分析库statsmodels和scikit-learn,和数据可视化库matplotlib。pandas是基于NumPy数组构建的,特别是基于数组的函... 查看详情

java学习第五篇--java基础语法

1.Java关键字     定义:被Java语言赋予特定含义的单词     注意:goto和const是Java的保留字用于定义访问权限修饰符的关键字   private  protected  public用于定义类,函数,变量... 查看详情

r绘图第五篇:绘制点图(ggplot2)(代码片段)

点图,也可以叫做散点图,通过绘制散点来呈现数据的分布,使用geom_dotplot()函数来绘制点图:geom_dotplot(mapping=NULL,data=NULL,position="identity",...,binwidth=NULL,binaxis="x",method="dotdensity",binpositions="bygroup",stackdir="up",stackr 查看详情

数据结构第五篇——栈和队列

目录前言一、栈的定义和特点二、栈的逻辑结构以及基本操作2.1用抽象数据类型来定义栈的数据结构2.2顺序栈的定义及其特点2.3顺序存储结构对栈基本操作的实现2.4链栈的定义及其特点2.5链式存储结构对栈基本操作的实现三、队... 查看详情

数据结构第五篇——栈和队列

目录前言一、栈的定义和特点二、栈的逻辑结构以及基本操作2.1用抽象数据类型来定义栈的数据结构2.2顺序栈的定义及其特点2.3顺序存储结构对栈基本操作的实现2.4链栈的定义及其特点2.5链式存储结构对栈基本操作的实现三、队... 查看详情

java笔记第五篇文本编辑器初见面

#日常唠叨#从现在开始,又要开始讲理论了,小星星努力今天写完文本编辑器之后再用2天时间写完数据类型,然后上代码,另外关于HelloWorld代码的讲解小星星会在写完运算符之后写编译厉害归厉害,但对我们打代码的流畅度、... 查看详情

第五篇:数据预处理-异常值处理

...多用到的是多维度异常检测,这部分得到时结合具体项目学习。异 查看详情

小刘同学的第五篇博文

...的很慢,特别是一个人在自习室啃书,总是会走神,其实学习最忌讳走神,不专注。。。 第一个问题就把我难住了,下午总是在想也还没想出来,到现在也没彻底想透。 总是报错我的where和and用错了,应该是insert后面不... 查看详情

小白学习windows第五篇

一、创建共享文件夹通过公用文件夹共享文件通过计算机上的文件夹设置共享右击文件夹—属性—共享—高级共享—勾选共享此文件夹二、访问共享文件夹1、通过“网络”浏览(必须启用“网络发现”)2、通过UNC路径\服务器IP\... 查看详情

第五篇[机器学习]机器学习,逻辑回归comeon

 逻辑回归,简单的说,就是用sigmoid函数把连续函数归一化转化成离散的几个可能的结果。逻辑回归的算法最大似然法: 我自己的理解,最大似然法就是在你观测到某一系列事件出现的可能性之后,倒推该事件最可能的... 查看详情

git教程学习--第五篇bug分支

一、分支管理策略1.首先创建并切换dev分支gitcheckout-bdev2.新建dev.txt文件,并添加gitadddev.txt二、Bug分支1.当工作进行到一半,还没办法提交,但是还要修复bug,怎么办呢先把工作现场“储藏”起来,等以后恢复现场后继续工作:git... 查看详情

pytorch深度学习50篇·······第五篇:yolo-----数据标签的准备(代码片段)

兄弟们,朋友们,为期两周的驻场生活结束了,没准说不定啥时候有要去,所以抓紧把YOLO篇搞定,驻场可是太累了,早6晚9,这和早9晚6可是一个天上一个地下啊,好了,废话不多说,今天... 查看详情

activemq学习第五篇:activemq伪集群学习(代码片段)

启动多实例#1、将conf文件夹复制一份cp-rconf/conf-1/#主要是修改conf-1目录activemq.xml#2、修改Broker名称<brokerxmlns="http://activemq.apache.org/schema/core"brokerName="localhost-1"dataDirectory="$activemq.data">#3、数据存储如果使用... 查看详情