数据转换:split-apply-combine模式-程序员宅基地

技术标签: python  大数据  

本文主要介绍数据转换中的split-apply-combine模式,包括baseR、plyr中的相关函数的应用。

split-apply-combine模式

大型数据集通常是高度结构化的,结构使得我们可以按不同的方式分组,有时候我们需要关注单个组的数据片断,有时需要聚合不同组内的信息,并相互比较。
因此对数据的转换,可以采用split – apply – combine模式来进行处理:
split:把要处理的数据分割成小片断;
apply:对每个小片断独立进行操作;
combine:把片断重新组合。

利用这种模式解决问题在很多数据分析或编程问题中都会出现:
Python当中,是map( ),filter( ),reduce( );
Google 有MapReduce;
R 当中是split( ),*apply( ),aggregate( )…,以及plyr包。

baseR

在R当中,split这个步骤是由split( ),subset( )等等函数完成的。 

函数split()可以按照分组因子,把向量,矩阵和数据框进行适当的分组。它的返回值是一个列表,代表分组变量每个水平的观测。这个列表可以使用sapply(),lappy()进行处理(apply – combine步骤),得到问题的最终结果。 

split( )的基本用法是:group <- split(X,f),其中X 是待分组的向量,矩阵或数据框。f是分组因子。

split还有一个逆函数,unsplit,可以让分组完好如初。
在base包里和split功能接近的函数有cut(对属性数据分划),strsplit(对字符串分划)以及
subset(对向量,矩阵或数据框按给定条件取子集)等。

接下来的apply – combine步骤主要由apply函数族完成。

apply :Apply Functions Over Array Margins 
 by :Apply a Function to a Data Frame Split by Factors
 eapply :Apply a Function Over Values in an Environment 
lapply :Apply a Function over a List or Vector 
mapply :Apply a Function to Multiple List or Vector Arguments 
rapply :Recursively Apply a Function to a List 
tapply :Apply a Function Over a Ragged Array
除此之外,还有可作为lapply变形的sapply,vapply和 replicate,共计10个函数。

  • apply函数通过对数组,矩阵,或非空维数值的数据框的“边缘”(margin)即行或列运用函数。返回值为向量,数组或列表。

函数形式
apply(X, MARGIN, FUN, ...)
其中,X:数组(矩阵);
MARGIN:函数要作用的下标向量,对于矩阵,1表示行,2表示列,1:2表示行和列;
FUN:函数名或函数表达式。

  • by函数是tapply的一个面向用户的友好包装版,是一个使用因子来对数据框按行进行分组并对每个子集运用函数的方法。它的对象数据被默认强制转换为数据框。它返回一个 类属性为by的对象,simplify i= false是,返回值是列表,否则是列表或数组。

by(data, INDICES, FUN, ..., simplify = TRUE)

 

参考:

https://site.douban.com/182577/widget/notes/10567181/note/245088040/

https://site.douban.com/182577/widget/notes/10567181/note/245242931/

 

plyr包

plyr包可以针对不同的数据类型,在一个函数内同时完成split-apply-combine三个步骤,从而实现最大限度的高效和简洁。plyr包特别适合处理大型数据集问题,比如对空间数据的空间位置或时间序列面板数据的时间点建模,或者在高维数组中进行数据探索等等。

plyr的基本函数集如下:

命名规则:前三行是基本类型。
根据输入类型和输出类型:a=array,d=data frame,l=list,_表示输出放弃。第一个字母表示输入,第2个字母表示输出。

后两行是对应apply族的replicates和mapply这两个函数,分别表示n次重复和多元函数参数的情况,第2个字母还是表示输出类型。

参数说明:这些函数有两到三个主要参数,依赖于输入的类型:

  • a*ply( .data, .margins, .fun, ..., .progress = "none")
  • d*ply( .data, .variables, .fun, ..., .progress = "none")
  • l*ply( .data, .fun, ..., .progress = "none")

参数.data是我们要用来分片-计算-合并的;参数.margins或者.variables描述了分片的方式;
参数.fun表示用来处理的函数,其它更多的参数是传递给处理函数的;参数.progress用来控制显示一个进度条。

本来是搞不清楚这几个函数到底有哪几个参数的,实在不好记。但是其实认真思考的话,才懂得上面所说的(主要参数依赖于输入类型)的意思,就例如输入类型时向量a时,其分片的话只能按照维度分,于是便有了.margins参数,输入类型为数据框d时,分片只能是某一个特征向量.variables,而列表的分片只能是其元素了,唯一确定,便不需指定了。

输入类型有三种,每一种类型给出了如何进行分片的不同方法。
简单来说:
a*ply( ):数组(包括矩阵和向量)按维数分为低维的片。
d*ply( ):数据框被变量组合分成子集。
l*ply( ):列表的每个元素就是一个分片。

因此,对输入数据集的分片,不是取决于数据的结构,而是取决于所采用的方法。
一个对象采用a*ply( )分片必须对应dim( )且接受多维的索引;采用d*ply( )分片,要利用split( )并强制转换为列表;采用l*ply( ),需要用length() and [。
所以数据框可以被传递给a*ply( ),可以象2维的矩阵那样处理,也可以传递给l*ply( ),被视为一个向量的列表。

 三种类型各自的特点:
(a): 输入数组(a*ply( ))
a*ply( )的分片特点在于.margins参数,它和apply很相似。
对于2维数组,.margins可以取1,2,或者c(1:2),对应2维数组的3种分片方式。
如图,

对于3维数组,则有7种分片方式:

.margins对应更高维的情况,可能会面临一种爆发式的组合。

(b)输入数据框(d*ply( ))

使用d*ply时,需要特别指定分组所用的变量或变量函数,它们会被首先计算,然后才是整个数据框。
有下面几种指定方式:

  • (var1)。按照变量var1的值来对数据框分组
  • 多重变量
  • .(a,b,c)。将按照三个变量的交互值来分组。这种形式输出的时候,有点复杂。如果输出为数组,则数组会有三个维度,分别以a,b,c的值作为维数名。如果输出为数据框,将会包含a,b,c取值的三个额外的列。如果输出为列表,则列表元素名为按周期分割的a,b,c的值。
  • 作为列名的字符向量:c("var1", "var2")。
  • 公式~ var1 + var2。

(c)输入列表(l*ply( ))
l*ply( )不需要描述如何分片的函数,因为列表本身就是按照元素的分划。使用l*ply( )相当于a*ply( )作用于一维数组的效果。

 

参考:

https://site.douban.com/182577/widget/notes/10567181/note/246634257/

https://site.douban.com/182577/widget/notes/10567181/note/246993843/

plyr案例:https://site.douban.com/182577/widget/notes/10567181/note/251668932/

https://site.douban.com/182577/widget/notes/10567181/note/252096396/

 

转载于:https://www.cnblogs.com/Hyacinth-Yuan/p/8312957.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ban2413/article/details/101671337

智能推荐

YDOOK:ANSYS 进行电磁场仿真的第二步:建模、制定特性和分网_ansys的电磁场建模-程序员宅基地

文章浏览阅读620次。1. 先建立模型;2. 再在建立好的模型的各个区域中内制定特性;一般需要指定的特性有:1. 单元类型;2. 选项;3. 单元坐标系;4. 实常数;5. 材料性质。3. 通过 GUI 为模型中的各个区域赋予特性。4. 可以通过以下命令为模型的各个区域赋予特性:ASEL >> 选择..._ansys的电磁场建模

小知识 (2)_int b = max_element(a, a+4) - a;-程序员宅基地

文章浏览阅读125次。1.max_element()函数和min_element()函数,就是找最大值最小值,数组:int position=max_element(a,a+n)-a;//返回在数组中的下标int data=*max_element(a,a+n);//返回值容器: int position=max_element(v.begin(), v.end())-v.begin(); int it..._int b = max_element(a, a+4) - a;

unity2018.3版本win10 SDK和JDK 安装_unity 2018.3.1 用哪个版本的jdk-程序员宅基地

文章浏览阅读4.7k次,点赞3次,收藏13次。SDK和JDK获取:链接:https://pan.baidu.com/s/1PI54NAVJCNFpV7cPfBkg5w提取码:k4bd1、下载JDK,安装jdk8.152版本配置环境变量:在系统变量中添加:1、变量名:Java_home; 变量值:C:\Program Files\Java\jre1.8.0_152(jdk安装路径)2、变量名:ClassPath; 变量值:.;..._unity 2018.3.1 用哪个版本的jdk

Map简介_介绍一下map-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏19次。Map简介HashMapTreeMapMap 的遍历小结Map 是一组成对的“键值对”对象,允许使用键 (key) 来查找值 (value)。它提供了一个映射表,可以通过某个对象来查找另一个对象。它也被称作关联数组,因为它将某些对象与另外一些对象关联在一起;或者称作字典,通过键对象来查找值对象,就像在字典中使用单词来定义一样。Map 基本特性:以 key-value 键值对的形式存储数据,..._介绍一下map

兄弟mfc9140cdn无法识别_兄弟Brother MFC-9140CDN打印机驱动下载-程序员宅基地

文章浏览阅读357次。兄弟Brother MFC-9140CDN打印机驱动官方版是一款专业实用的驱动程序,兄弟Brother MFC-9140CDN打印机驱动官方版可以适用于型号为MFC-9140CDN的打印机,兄弟BrotherMFC-9140CDN打印机驱动最新版主要用于解决打印机无法被电脑识别的问题,增加打印机使用的稳定性。基本参数产品定位多功能商用一体机产品类型彩色激光多功能一体机涵盖功能打印/复印..._兄弟mfc9140cdn链接打印机

Debian上安装rz/sz包_debian rz-程序员宅基地

文章浏览阅读3.9k次。在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件.对于Debian, rz/sz默认没有安装所以需要手工安装. sz: 将选定的文件发送(send)到本地机器; rz:运行该命令会弹出一个文件选择窗口, 从本地选择文件上传到服务器(receive). 1. 软件安装 把安装文件上传到/tmp目录下. # cd /tm_debian rz

随便推点

win10 wifi连接不上服务器未响应,Win10无线网连不上怎么办|Win10 WIFI无法连接5招解决...-程序员宅基地

文章浏览阅读1.2k次。现在大部分用户都会使用无线连接来上网,使用电脑的朋友可能会遇上无线无法连接,Wifi连接不上的一些问题,这时相信很多朋友都会无从下手,不知道如何解决,其实通过以下5招就可以完美解决了,遇上无线连接不上的朋友赶紧来学习一下吧。第一招、无线网卡驱动问题无线网卡驱动出现问题肯定会导致上不了网,解决起来也不难。1、右键单击“开始”按钮并从菜单中选择“设备管理器”,启动到设备管理器窗口后,展开“网络适配器”..._win10无线网卡连不上wifi

php ffplay.exe输出,四、FFmpeg使用---FFmpeg程序的使用(ffmpeg.exe, ffplay.exe, ffprobe.exe)-程序员宅基地

文章浏览阅读122次。欢迎加入技术交流群群号: 552340860一、FFmpeg程序的使用(ffmpeg.exe, ffplay.exe, ffprobe.exe)本章主要介绍一下ffmpeg工程包含的三个exe的使用方法。ffmpeg的官方网站是:http://ffmpeg.org/编译好的可用版本的下载地址: http://ffmpeg.zeranoe.com/builds/根据平台自行下载对应的版本,如图所示..._php ffplay

python数字转百分比%,保留小数点后两位_python百分数保留两位小数-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏7次。python数字转百分比%,保留小数点后两位zrs = 215nan = 100nan_zb = "%.2f"%(float(nan/zrs)*100)+"%"print(type(nan_zb))print("男生占总人数的: ",nan_zb)#结果:# <class 'str'># 男生占总人数的: 46.51%_python百分数保留两位小数

tensorflow_2.2_Resnet50实现花的识别_resnet50花卉图像识别-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏6次。Resnet50介绍Resnet50与之前在Resnet34中介绍的几乎一样,唯一有区别的就是:残差块由两层卷积变成了三层卷积,网络更深,如下:# 结构快def block(x, filters, strides=1, conv_short=True): if conv_short: short_cut = Conv2D(filters=filters*4, kernel_size=1, strides=strides, padding='valid')(x) _resnet50花卉图像识别

android多线程多文件下载,android 多线程并发下载文件-程序员宅基地

文章浏览阅读332次。Download.javapackage com.wansha;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android..._安卓 多文件下载

失真系数 matlab,加载相机矩阵和失真系数-程序员宅基地

文章浏览阅读267次。我正在尝试校准相机,使用AruCo标记进行头部姿势估计 . 我尝试在C中通过OpenCV库进行校准但没有成功,所以我使用MATLAB相机校准工具箱校准了我的相机,我的AruCo标记检测代码在C中,需要相机矩阵和失真系数作为参数 . 我的问题是如何在标记检测功能中加载这些参数 . 我尝试将相机矩阵和失真系数存储在数组中,它显示错误“ argument of type int is incompati..._argument of type "int **" is incompatible with parameter of type "int *

推荐文章

热门文章

相关标签