R数据分析当中的化整为零(Split-Apply-Combine)策略_光环大数据培训

来源:互联网 由 光环IT学院 贡献 责任编辑:王小亮  
http://hadoop.aura-el.com

R数据分析当中的化整为零(Split-Apply-Combine)策略_光环大数据培训什么时候我们需要使用到化整为零的策略呢?有以下三种情况:

数据需要分组处理

数据需要按照每行或者每列来处理

数据需要分级处理,和分组很类似,但是分级时需要考虑分级之间的关系。

化整为零策略有点类似于由Google推广的map-reduce策略。当然map-reduce策略的基础是网格,而这

里的Split-Apply-Combine的基础完全可以是单机,甚至不支持并行处理的单机都可以。

然而,化整为零并不是一个很直观的编程过程。最直观的过程是使用Loop 循环。这里使用一个例子来讲解

一下如何实现化整为零策略。在plyr包中有数据ozone,它是一个三维矩阵(24X24X72),其中最后一维72

是指的6年12个月每个月的结果。也就是ozone是一个包括了连续72个月24X24的三维矩阵数据。三维分

别是lat,long,time。我们需要由对时间robust linear model之后的残基

http://hadoop.aura-el.com

residuals。

> library(plyr) # need for dataset ozone> library(MASS) # need for function rlm> month <- ordered(rep(1:12, length=72)) #set time sequence> #try one set> one <- ozone[1,1,]> model <- rlm(one ~ month - 1); modelCall:rlm(formula = one ~ month - 1)Converged in 9 iterations Coefficients: month1 month2 month3 month4 month5 month6 month7 month8 month9 month10 month11 month12 264.3964 259.2036 255.0000 252.0052 258.5089 265.3387 274.0000 276.6724 277.0000 285.0000 283.6036 273.1964 Degrees of freedom: 72 total; 60 residualScale estimate: 4.45 > deseas <- resid(model)

现在我们对每一组数据都做相同的处理。首先使用for loop,这样比较直

> deseasf <- function(value) rlm(value ~ month -1) #the function> models <- as.list(rep(NA, 24*24)) #prepare the variable> dim(models) <- c(24, 24)> deseas <- array(NA, c(24,24,72)) #prepare the variable> dimnames(deseas) <- dimnames(ozone)> for (i in seq_len(24)) { #for loop for first dimension+ for(j in seq_len(24)) { #for loop for second dimension+ mod <- deseasf(ozone[i, j, ]) #apply function+ models[[i, j]] <- mod #save data+ deseas[i, j, ] <- resid(mod) #get residure+ }+ }

接下来我们使用化整为零的策略。因为数据可以分成24X24块来处理,每一

块都是单独运算,可以并行处

http://hadoop.aura-el.com

理。而使用for loop,只能一块接一块的处理,在速度上可能没有并行处理来得快。而在R当中,有一系列

相关的函数,apply, l

apply, sapply, tapply, mapply, sweep。我们先得了解这些函数,然后再来应用它们。最简单的是apply

其形式是apply(array, margin, function, …)。首先,apply的对象是矩阵array或者matrix。它的第二个参

数是指的维度,如果你的array是一个二维矩阵,需要按横排的方式计算每一排的平均值,那么你的第二个

参数就应该是1。如果需要按纵列的方式计算每一列的平均值,那么第二个参数就应该是2。当然还可以使

用c(1,2)这样的方式来设置第二个参数,就是并行计算每个值。第三个参数是需要应用的函数。之后的…是

需要传入函数的其它参数。而apply的返回值就是由function来确定的,它可能是vector, array or list。

下面举个例子比较容易理解。

> x<-cbind(x1=3,x2=c(4:1,2:5))> dimnames(x)[[1]]<-letters[1:8]> x

http://hadoop.aura-el.com

x1 x2a 3 4b 3 3c 3 2d 3 1e 3 2f 3 3g 3 4h 3 5> apply(x,2,mean,trim =.2) #在这里,trim =.2就是mean(x, trim = 0, na.rm

= FALSE, ...)函数当中的一个参数。x1 x2 3 3 > apply(x,1,mean,trim =.2) a b c d e f g h 3.5 3.0 2.5 2.0 2.5 3.0 3.5 4.0 > col.sums

<- apply(x, 2, sum)> row.sums <- apply(x, 1, sum)> rbind(cbind(x, Rtot

= row.sums), Ctot = c(col.sums, sum(col.sums))) x1 x2 Rtota 3 4 7b 3 3 6c 3 2 5d 3 1 4e 3 2 5f 3

3 6g 3

4 7h 3

8Ctot 24 24 48> sum.plus.y <- function(x,y){+ sum(x) + y+ }> apply(x, 1, sum.plus.y, 3) #使用自定

义函数 a b c d e f g h 10 9 8 7 8 9 10 11

理解了apply,就可比较容易地理解lapply, sapply, vapply了。这三者针

对的对象是list或者Vector。其形

式为

lapply(X, FUN, ...)sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)

我们看到,它没有了apply当中所需要的第二个参数margin,其原因就是

输入对象不是array或者matrix

,而是list或者Vector。先举个最简单的应用例子。

> x <- list(a = 1:10, beta = exp(-3:3), logic =

c(TRUE,FALSE,FALSE,TRUE))> x$a [1] 1 2 3 4 5 6 7 8 9 10 $beta[1] 0.04978707 0.13533528 0.36787944 1.00000000 2.71828183 7.38905610 20.08553692 $logic[1] TRUE FALSE FALSE TRUE >

http://hadoop.aura-el.com

lapply(x,mean)$a[1] 5.5 $beta[1] 4.535125 $logic[1] 0.5

也就是说,其x的维度应该是一维的,当然,其下面的元素可以是多维的。那么如果x是一个矩阵呢?我们

先来看例子。

> x<-cbind(x1=3,x2=c(4:1,2:5))> dimnames(x)[[1]]<-letters[1:8]> x x1 x2a 3 4b 3 3c 3 2d 3 1e 3 2f 3 3g 3 4h 3 5> x<-as.data.frame(x)> as.list(x)$x1[1] 3 3 3 3 3 3 3 3 $x2[1] 4 3 2 1 2 3 4 5 > lapply(x,function(.ele) mean(.ele))$x1[1] 3 $x2[1] 3 > sapply(x,mean)x1 x2 3 3 > vapply(x,mean,1)x1 x2 3 3

从它们的说明文件我们知道,无论你传入的x是什么,它首先做的一步说是使用as.list来将其转换成一个一

维的list。所以,一个data.frame传入lapply之后,它的colnames将会转换成list的names,而rowname

s可能会丢失。比较可知,lapply和sapply的差别在于,lapply的返回值是一个list,而sapply的返回值是

一个矩阵。sapply的返回值其实就是在lapply的基础上再使用了simplify2array(x, higher=TRUE)函数,

使用其结果变成一个array。为了更清楚地了解sapply和vapply,我们看下面的例子

以下内容为系统自动转化的文字版,可能排版等有问题,仅供您参考:

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com R 数据分析当中的化整为零(Split-Apply-Combine)策略_光环大数据培训

什么时候我们需要使用到化整为零的策略呢?有以下三种情况:

数据需要分组处理

数据需要按照每行或者每列来处理 数据需要分级处理,和分组很类似,但是分级时需要考虑分级之间的关 系。

化 整 为 零 策 略 有 点 类 似 于 由 Google 推 广 的 map-reduce 策 略 。 当 然 map-reduce 策略的基础是网格,而这

里的 Split-Apply-Combine 的基础完全可以是单机, 甚至不支持并行处理的 单机都可以。

然而,化整为零并不是一个很直观的编程过程。最直观的过程是使用 Loop 循环。这里使用一个例子来讲解

一下如何实现化整为零策略。在 plyr 包中有数据 ozone,它是一个三维矩阵 (24X24X72),其中最后一维 72

是指的 6 年 12 个月每个月的结果。 也就是 ozone 是一个包括了连续 72 个月 24X24 的三维矩阵数据。三维分

别是 lat,long,time。我们需要由对时间 robust linear model 之后的残基

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com residuals。

> library(plyr) # need for dataset ozone> library(MASS) # need for function rlm> month <- ordered(rep(1:12, length=72)) #set time sequence> #try one set> one <- ozone[1,1,]> model <- rlm(one ~ month - 1); modelCall:rlm(formula = one ~ month - 1)Converged in 9 iterations Coefficients: month7 month8 month1 month9 month2 month10 month3 month11 month4 month5 month6

month12 264.3964 259.2036

255.0000 252.0052 258.5089 265.3387 274.0000 276.6724 277.0000 285.0000 283.6036 273.1964 Degrees of freedom: 72 total; 60 residualScale

estimate: 4.45 > deseas <- resid(model)

现在我们对每一组数据都做相同的处理。首先使用 for loop,这样比较直 观

> deseasf <- function(value) rlm(value ~ month -1) #the function> models <- as.list(rep(NA, 24*24)) #prepare the variable> dim(models) <c(24, 24)> deseas <- array(NA, c(24,24,72)) #prepare the variable> dimnames(deseas) <- dimnames(ozone)> for (i in seq_len(24)) { #for loop for first dimension+ dimension+ for(j in seq_len(24)) { #for loop for second

mod <- deseasf(ozone[i, j, ]) #apply function+ deseas[i, j, ] <- resid(mod)

models[[i, j]] <- mod #save data+ #get residure+ }+ }

接下来我们使用化整为零的策略。因为数据可以分成 24X24 块来处理,每一 块都是单独运算,可以并行处

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com 理。而使用 for loop,只能一块接一块的处理,在速度上可能没有并行处 理来得快。而在 R 当中,有一系列

相关的函数,apply, l

apply, sapply, tapply, mapply, sweep。我们先得了解这些函数,然后再 来应用它们。最简单的是 apply

其形式是 apply(array, margin, function, ?)。首先,apply 的对象是矩 阵 array 或者 matrix。它的第二个参

数是指的维度,如果你的 array 是一个二维矩阵,需要按横排的方式计算每 一排的平均值,那么你的第二个

参数就应该是 1。如果需要按纵列的方式计算每一列的平均值,那么第二个 参数就应该是 2。当然还可以使

用 c(1,2)这样的方式来设置第二个参数,就是并行计算每个值。第三个参 数是需要应用的函数。之后的?是

需要传入函数的其它参数。而 apply 的返回值就是由 function 来确定的, 它可能是 vector, array or list。

下面举个例子比较容易理解。

> x<-cbind(x1=3,x2=c(4:1,2:5))> dimnames(x)[[1]]<-letters[1:8]> x

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com x1 x2a 3 4b 3 3c 3 2d 3 1e 3 2f 3 3g 3 4h 3 5>

apply(x,2,mean,trim =.2) #在这里,trim =.2 就是 mean(x, trim = 0, na.rm = FALSE, ...)函数当中的一个参数。x1 x2 a b c d e f g 3 3 > apply(x,1,mean,trim =.2)

h 3.5 3.0 2.5 2.0 2.5 3.0 3.5 4.0 > col.sums

<- apply(x, 2, sum)> row.sums <- apply(x, 1, sum)> rbind(cbind(x, Rtot = row.sums), Ctot = c(col.sums, sum(col.sums))) 7b 3 3 6g 3 3 6c 4 3 7h 2 3 5d 5 3 1 4e x1 x2 Rtota 3 2 5f 3 4 3

8Ctot 24 24

48> sum.plus.y <-

function(x,y){+ 义函数 a b c d

sum(x) + y+ }> apply(x, 1, sum.plus.y, 3) # 使用自定 e f g h 10 9 8 7 8 9 10 11

理解了 apply,就可比较容易地理解 lapply, sapply, vapply 了。这三者针 对的对象是 list 或者 Vector。其形

式为

lapply(X, FUN, ...)sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)

我们看到,它没有了 apply 当中所需要的第二个参数 margin,其原因就是 输入对象不是 array 或者 matrix

,而是 list 或者 Vector。先举个最简单的应用例子。

>

x

<-

list(a

=

1:10,

beta 1 2

= 3

exp(-3:3), 4 5 6 7

logic 8

=

c(TRUE,FALSE,FALSE,TRUE))> x$a [1] $beta[1] 7.38905610 0.04978707 0.13533528 $logic[1]

9 10

0.36787944 TRUE

1.00000000 FALSE FALSE

2.71828183 TRUE >

20.08553692

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com lapply(x,mean)$a[1] 5.5 $beta[1] 4.535125 $logic[1] 0.5

也就是说,其 x 的维度应该是一维的,当然,其下面的元素可以是多维的。 那么如果 x 是一个矩阵呢?我们

先来看例子。

> x<-cbind(x1=3,x2=c(4:1,2:5))> dimnames(x)[[1]]<-letters[1:8]> x x1 x2a 3 4b 3 3c 3 2d 3 1e 3 2f 3 3g 3 4h 3 5>

x<-as.data.frame(x)> as.list(x)$x1[1] 3 3 3 3 3 3 3 3 $x2[1] 4 3 2 1 2 3 4 5 > lapply(x,function(.ele) mean(.ele))$x1[1] 3 $x2[1] 3 > sapply(x,mean)x1 x2 3 3 > vapply(x,mean,1)x1 x2 3 3

从它们的说明文件我们知道,无论你传入的 x 是什么,它首先做的一步说是 使用 as.list 来将其转换成一个一

维的 list。所以,一个 data.frame 传入 lapply 之后,它的 colnames 将会 转换成 list 的 names,而 rowname

s 可能会丢失。比较可知,lapply 和 sapply 的差别在于,lapply 的返回值 是一个 list,而 sapply 的返回值是

一 个 矩 阵 。 sapply 的 返 回 值 其 实 就 是 在 lapply 的 基 础 上 再 使 用 了 simplify2array(x, higher=TRUE)函数,

使用其结果变成一个 array。为了更清楚地了解 sapply 和 vapply,我们看 下面的例子

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com > i39 <- sapply(3:9, seq)> i39[[1]][1] 1 2 3 [[2]][1] 1 2 3 4 [[3]][1] 1 2 3 4 5 [[4]][1] 1 2 3 4 5 6 [[5]][1] 1 2 3 4 5 6 7 [[6]][1] 1 2 3 4 5 6 7 8 [[7]][1] 1 2 3 4 5 6 7 8 9 > sapply(i39, fivenum) [,3] [,4] [,5] [,6] [,7][1,] 1.5 5[4,] 8.0 1.5 2.5 2 3.5 2.0 4 2.5 5.0 2.5 5.5 1.0 1.0 1 2.0 7[5,] 1.0 2.5 3.0 1.0 3 4.0 1.0 3.5 5 4.0 6.0 [,1] [,2] 1[2,] 4.5 7.0

3[3,] 6.5

9> vapply(i39, fivenum,+

c(Min. = 0, "1st Qu." = 0, Median [,1] [,2] [,3] [,4] [,5] [,6] [,7]Min.

= 0, "3rd Qu." = 0, Max. = 0)) 1.0 2.5 4 5.0 1.0 1 1.0 2.0 1.0 2.5 1.0 3 3.0

11st Qu. 3.5 4.0 4.0 5

1.5 4.5 6.0

1.5

2

2.0 2.5 9

2.5 3.5

3Median 5.5 6.5

53rd Qu. 7.0 8.0

7Max.

其中,fivenum 函数会返回一组数的最小值,四分位低值(lower-hinge), 中值,四分位高值(upper-

hinge),以及最大值。从上面的比较中,我们很清楚的看到,sapply 返回 值的排列形式,以 list 的 names

为 colnames。可以想象,它使用的是按列填充 matrix 的方式输出的。而 vapply 是在 sapply 的基础上,为 rownames 做出了定义。

除了上面介绍的,还有 tapply,mapply,sweep 等。它们的定义如下。如果需 要了解和掌握它们,需要熟悉

上面介绍的 apply, lapply, sapply 以及 vapply。还需要了解 split。所以 这里就不多加解释了(因为篇幅会

很长) 。

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com

tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)sweep(x, MARGIN,

STATS, FUN="-", check.margin=TRUE, ...)

有了上面的了解, 我们可以看一下最前面的 for loop 可以怎样改写为 apply 形式了。

> models <- apply(ozone, 1:2, deseasf) #这里相当于 for loop 当中的

for(i

in

seq_len(24)){for(j

in

seq_len(24)){mod<-deseasf(ozone[i,j,]); models[[i,j]]<-mod;}},

但是运算却是并行处理的。

>

resids_list

<-

lapply(models,

resid)>

resids

<-

unlist(resids_list)> dim(resids) <- c(72, 24, 24)> deseas <- aperm(resids, c(2, 3, 1))> dimnames(deseas) <- dimnames(ozone)

如果,我们知道的并不是 ozone 这样一个 24X24X72 的已知确切维度的三维 数组,假如我们只有一个名为 ozonedf 的 matrix,它的 5 列分别为 lat, long, time, month,和 value。我们如果需要做上述的分析应该怎

么办呢?在思路上,我们的想法可能会是先从 ozonedf 出发生成一个类似 ozone 这样子的数据,然后再使

用 apply,lapply 这样的函数来完成就可以。第一步生成 ozone 这样子的数 据,就是化整为零策略

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com

(Split-Apply-Combine)的第一步了。

R> deseasf_df <- function(df) {+ rlm(value ~ month - 1, data = df)+ }R> pieces <- split(ozonedf, list(ozonedf$lat, ozonedf$long))R> models <lapply(pieces, deseasf_df)R> results <- mapply(function(model, df) {+ cbind(df[rep(1, 72), c("lat", "long")], resid(model))+ }, models, pieces)R> deseasdf <- do.call("rbind", results)

为什么大家选择光环大数据!

大数据培训、 人工智能培训、 Python 培训、 大数据培训机构、 大数据培训班、 数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请大数据 领域具有多年经验的讲师,提高教学的整体质量与教学水准。讲师团及时掌握时 代的技术,将时新的技能融入教学中,让学生所学知识顺应时代所需。通过深入 浅出、通俗易懂的教学方式,指导学生较快的掌握技能知识,帮助莘莘学子实现 就业梦想。

光环大数据启动了推进人工智能人才发展的“AI 智客计划” 。光环大数据专注国内 大数据和人工智能培训,将在人工智能和大数据领域深度合作。未来三年,光环大数据 将联合国内百所大学,通过“AI 智客计划” ,共同推动人工智能产业人才生态建设,培 养和认证 5-10 万名 AI 大数据领域的人才。

参加“AI 智客计划” ,享 2000 元助学金!

光环大数据 http://hadoop.aura-el.com

光环大数据--大数据培训&人工智能培训 http://hadoop.aura-el.com 【报名方式、详情咨询】 光环大数据网站报名:http://hadoop.aura-el.com 手机报名链接:http:// hadoop.aura-el.com /mobile/

光环大数据 http://hadoop.aura-el.com


  • 与《R数据分析当中的化整为零(Split-Apply-Combine)策略_光环大数据培训》相关:
  • 基于R语言的数据分析和挖掘方法总结_光环大数据培训
  • 培训大数据分析 哪家大数据分析培训靠谱_光环大数据
  • 基于R语言的数据分析和挖掘方法总结_光环大数据培训
  • 基于R语言的数据分析和挖掘方法总结_光环大数据培训
  • R的数据分析制霸以及企业级应用盘点_光环大数据培训
  • 数据分析培训班 数据分析都需要学习哪些内容_光环大
  • R语言与Excel之数据分析功能比较_光环大数据培
  • 关于什么是大数据和数据分析_深圳光环大数据人工智能
  • 关于大数据分析方法的几点思考_深圳光环大数据人工智
  • 数据分析技术给商业模式带来颠覆的五种方式_光环大数
  • 本站网站首页首页教育资格全部考试考试首页首页考试首页职业资格考试最近更新儿童教育综合综合文库22文库2建筑专业资料考试首页范文大全公务员考试首页英语首页首页教案模拟考考试pclist学路首页日记语文古诗赏析教育教育资讯1高考资讯教育头条幼教育儿知识库教育职场育儿留学教育高考公务员考研考试教育资讯1问答教育索引资讯综合学习网站地图学习考试学习方法首页14托福知道备考心经冲刺宝典机经真题名师点睛托福课程雅思GREGMATSAT留学首页首页作文
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.xue63.com All Rights Reserved