• R语言 apply,sapply,lapply,tapply,vapply, mapply的用法


    apply()

    apply(m,dimcode,f,fargs)

    • m 是一个矩阵。
    • dimcode是维度编号,取1则为对行应用函数,取2则为对列运用函数。
    • f是函数
    • fargs是f的可选参数集
    > z <- matrix(1:6, nrow = 3)
    > f <- function(x) {
    +         x/c(2, 8)
    + }
    > apply(z,1,f)  #f函数得到两个元素,则为几行,竖着来的
          [,1]  [,2] [,3]
    [1,]  0.5 1.000 1.50
    [2,]  0.5 0.625 0.75


    zzz=matrix(1:6,nrow=2)
    zzz
    yyy <- apply(zzz, 1, function(x) sum( x <=3))
    yyy

     

     

    lapply()

    lapply()(代表list apply)与矩阵的apply()函数的用法类似, 对列表的每个组件执行给定的函数,并返回另一个列表。

    > x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
    > lapply(x, mean)
    $a
    [1] 5.5
    
    $beta
    [1] 4.535125
    
    $logic
    [1] 0.5

    sapply()

    sapply()(代表simplified [l]apply)可以将结果整理以向量,矩阵,列表 的形式输出。

    > sapply(x, mean)
           a     beta    logic 
    5.500000 4.535125 0.500000 
    > sapply(x, quantile)   #每一个对应组件输出5个元素,所以为5行,像矩阵一样,竖着来的。
             a        beta logic
    0%    1.00  0.04978707   0.0
    25%   3.25  0.25160736   0.0
    50%   5.50  1.00000000   0.5
    75%   7.75  5.05366896   1.0
    100% 10.00 20.08553692   1.0
    > sapply(2:4, seq)
    [[1]]
    [1] 1 2
    
    [[2]]
    [1] 1 2 3
    
    [[3]]
    [1] 1 2 3 4

    vapply()

    vapply()与sapply()相似,他可以预先指定的返回值类型。使得得到的结果更加安全。

    > vapply(x, quantile, c(1,2,5,6,8))   #它需要一个5个长度的向量来告诉他返回的类型,向量里面的内容可以变换
             a        beta logic
    0%    1.00  0.04978707   0.0
    25%   3.25  0.25160736   0.0
    50%   5.50  1.00000000   0.5
    75%   7.75  5.05366896   1.0
    100% 10.00 20.08553692   1.0

    tapply( )

    tapply(x,f,g)需要向量 x (x不可以是数据框),因子或因子列表 f , 函数 g 。
    tapply()执行的操作是:按照f对x分组,在分组后的向量上运行函数 g

    > a <- c(24,25,36,37)
    > b <- c('q', 'w', 'q','w')
    > tapply(a, b, mean)
     q  w 
    30 31 

    mapply()

    多参数版本的sapply()。第一次计算传入各组向量的第一个元素到FUN,进行结算得到结果;第二次传入各组向量的第二个元素,得到结果;第三次传入各组向量的第三个元素…以此类推。

    l1 <- list(a = c(1:10), b = c(11:20))
    l2 <- list(c = c(21:30), d = c(31:40))
    mapply(sum, l1$a, l1$b, l2$c, l2$d)
    ## [1] 64 68 72 76 80 84 88 92 96 100
     
    REF:
    https://www.cnblogs.com/xihehe/p/7473981.html
  • 相关阅读:
    bzoj2809 [Apio2012]dispatching
    bzoj2743[HEOI2012]采花
    bzoj3626[LNOI2014]LCA
    bzoj2038 [2009国家集训队]小Z的袜子(hose)——莫队
    bzoj2442[Usaco2011 Open]修剪草坪——单调队列优化
    bzoj1588[HNOI2002]营业额统计——双向链表
    洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
    bzoj1503[NOI2004]郁闷的出纳员——Splay
    洛谷P2014——选课
    洛谷P1352——动规
  • 原文地址:https://www.cnblogs.com/emanlee/p/8533258.html
Copyright © 2020-2023  润新知