关于R傍边的mapply
当前位置:以往代写 > 其他教程 >关于R傍边的mapply
2019-06-14

关于R傍边的mapply

关于R傍边的mapply

之前的博客《R数据阐明傍边的化整为零(Split-Apply-Combine)计策》以及《关于R傍边的tapply》有提到一些关于lapply, sapply, vapply和tapply的内容。对付mapply只是粗粗带过。但许多时候,利用mapply可以辅佐我们大大提高效率。我们先来看一个很是时用的函数yapply。

yapply <- function(X,FUN, ...) { 
  index <- seq(length.out=length(X)) 
  namesX <- names(X) 
  if(is.null(namesX)) 
    namesX <- rep(NA,length(X))
 
  FUN <- match.fun(FUN) 
  fnames <- names(formals(FUN)) 
  if( ! "INDEX" %in% fnames ){ 
    formals(FUN) <- append( formals(FUN), alist(INDEX=) )   
  } 
  if( ! "NAMES" %in% fnames ){ 
    formals(FUN) <- append( formals(FUN), alist(NAMES=) )   
  } 
  mapply(FUN,X,INDEX=index, NAMES=namesX,MoreArgs=list(...)) 
}

利用这个yapply,它很是雷同lapply,所差异的是,它可以在函数中利用NAMES以及INDEX两个变量,这两个变量别离是list的names以及索引号。当有两个索引号相关的数据,可能名称相关的数据需要在一个lapply中举办操纵的时候,就变得很是利便。好比

> a <- 1:10
> names(a) <- letters[1:10]
> b <- 2:11
> names(b) <- letters[2:11]
> a
 a  b  c  d  e  f  g  h  i  j 
 1  2  3  4  5  6  7  8  9 10 
> b
 b  c  d  e  f  g  h  i  j  k 
 2  3  4  5  6  7  8  9 10 11 
> aplusb<-function(.a,.b){.a+.b}
> mapply(aplusb,as.list(a),as.list(b))
 a  b  c  d  e  f  g  h  i  j 
 3  5  7  9 11 13 15 17 19 21 
> aplusbByname <- function(.a, NAMES){if(NAMES %in% names(b)) .a+b[[NAMES]] else .a}
> mapply(aplusbByname,as.list(a),names(a))
 a  b  c  d  e  f  g  h  i  j 
 1  4  6  8 10 12 14 16 18 20

mapply的原型是:mapply(FUN, …, MoreArgs = NULL, SIMPLIFY = TRUE,
USE.NAMES = TRUE)
个中…可以是一系列长度相等的list/vector等。它们是做为FUN的参数一一对应的传入FUN傍边去利用。由此可以,mapply是处理惩罚多个有关联的list以及vector的好帮忙。

    关键字:

在线提交作业