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

在使用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

时间: 2024-10-08 10:48:31

R学习笔记 第五篇:数据变换和清理的相关文章

MyCat 学习笔记 第十篇.数据分片 之 ER分片

1 应用场景 这篇来说下mycat中自带的er关系分片,所谓er关系分片即可以理解为有关联关系表之间数据分片.类似于订单主表与订单详情表间的分片存储规则. 本文所说的er分片分为两种: a. 依据主键进行数据分片,验证发现主表数据保存在第1个datanode中,子表数据根据分片规则存储. b. 依据分片关键字段进行分片,验证发现主表与子表根据分片规则存储,且保存在相同的分片内. 接下来,可以下实际配置与数据验证 2 环境说明 参考  <MyCat 学习笔记>第六篇.数据分片 之 按月数据分片 

西门子PLC学习笔记十五-(数据块及数据访问方式)

一.数据块 数据块是在S7 CPU的存储器中定义的,用户可以定义多了数据块,但是CPU对数据块数量及数据总量是有限制的. 数据块与临时数据不同,当逻辑块执行结束或数据块关闭,数据块中的数据是会保留住的. 数据块分共享数据块.背景数据块.用户自定义数据块,下面分别介绍. 1.共享数据块(全局数据块) 其用于存储全局数据,所有逻辑块(OB.FC.FB)都可以访问共享数据块中的数据. 2.背景数据块(私有存储区) 其用做功能块(FB)的"存储器".FB的参数和静态变量安排在它的背景数据块中.

【数据分析 R语言实战】学习笔记 第五章 数据的描述性分析(上)

5.1R内置的分布 分布是描述一个样本数据最核心.最重要的方式.R内嵌了很多常用的统计分布,提供了四类函数:概率密度函数(density),累积分布函数(probability).分位数(quantile)和伪随机数(random).在R中分别用d,p,q,r表示这4个项目,后面接分布的英文名称或缩写. 5.2集中趋势的分析 5.2.1集中趋势的测度 描述统计分布集中趋势的指标主要是平均数.中位数.众数,也称为“平均指标”.这些指标的主要作用包括: 反映总体各单位变量分布的集中趋势和一般水平;

MyCat 学习笔记 第十一篇.数据分片 之 分片事务处理

1 环境说明 VM 模拟3台MYSQL 5.6 服务器 VM1 192.168.31.187:3307 VM2 192.168.31.212:3307 VM3 192.168.31.150:  3307 MYCAT 1.5 服务部署在宿主机上 MYCAT 192.168.31.207 :8806[SQL执行端口] / 9066[管理端口] 2 应用场景 2.0 MYCAT配置 schema.xml <schema name="TESTDB" checkSQLschema=&quo

R 学习笔记《五》 R语言初学者指南--第二章总结

第二章学习了的R函数: 1 sum                     计算和 sum(x,na.rm=TRUE)  计算向量x中所有数的和,其中排除了NA元素 2 median                 计算中位数           返回一个样本数据中间的那个数  median(x,na.rm=TRUE) 3 max                    计算最大值            max(x,na.rm=TRUE) 4 min                    计算最小

Django学习笔记第五篇--实战练习一--查询数据库并操作cookie

一.启动项目: 1 django-admin start mysite1 2 cd mysite1 3 python manage.py startapp loginapp 根据上文敲命令就可以创建好了一个项目结构,之后就是修改配置文件,这里使用的数据库是MySQL的. 二.修改配置文件: settings.py 1 """ 2 Django settings for mysite1 project. 3 4 Generated by 'django-admin startp

linux学习笔记第五篇

自动安装系统 1.kick脚本 kick脚本是自动应答系统在安装工程中一切问题的脚本文件这个文件可以实现系统的自动安装在系统安装完毕后会在系统的root家目录中生成 anaconda-ks.cfg 这个文件就是以此系统模板生成的kickstart 2.kickstart脚本的制作 手动编写难度很大 系统中system-config-kickstart工具可以以图形方式制作kickstart 安装图形制作工具 yum insatll system-config-kickstart -y 安装完成后

MyCat 学习笔记 第十一篇.数据分片 之 分片数据查询 ( select * from table_name limit 100000,100 )

1 环境说明 VM 模拟3台MYSQL 5.6 服务器 VM1 192.168.31.187:3307 VM2 192.168.31.212:3307 VM3 192.168.31.150:  3307 MYCAT 1.5 服务部署在宿主机上 MYCAT 192.168.31.207 :8806[SQL执行端口] / 9066[管理端口] 2 应用场景 2.0 MYCAT配置 schema.xml <schema name="TESTDB" checkSQLschema=&quo

MyCat 学习笔记 第十三篇.数据分片 之 通过HINT执行存储过程

1 环境说明 VM 模拟3台MYSQL 5.6 服务器 VM1 192.168.31.187:3307 VM2 192.168.31.212:3307 VM3 192.168.31.150:  3307 MYCAT 1.5 服务部署在宿主机上 MYCAT 192.168.31.207 :8806[SQL执行端口] / 9066[管理端口] 2 应用场景 2.0 MYCAT配置 schema.xml <schema name="TESTDB" checkSQLschema=&quo