美文网首页
apply家族函数:数据分组统计

apply家族函数:数据分组统计

作者: 冬之心 | 来源:发表于2021-11-25 07:50 被阅读0次

    title: "apply家族函数:数据分组统计"
    author: "wintryheart"
    date: "2021/11/24"
    output: html_document


    knitr::opts_chunk$set(echo = TRUE)
    

    摘要

    • apply: 按数据或矩阵的行或列进行函数统计。
    • lapply: 相当于list+apply,按列表进行函数统计。
    • sapply: 同lapply,只是返回值更简洁。
    • vapply: 同sapply,只是对FUN返回值可以定义。
    • mapply: 相当于multi-sapply
    • tapply: 相当于table+apply,按因子类型进行函数统计,适合做列联表

    apply

    apply(X, MARGIN, FUN, ...)

    • X操作对象为一个数组或矩阵(array or matrix)
    • MARGIN,对于矩阵,1代表行,2代表列,c(1,2)代表行和列。
    head(cars)
    apply(cars, 2, sum) #求列的边缘和
    
    

    lapply、sapply、vapply和mapply

    lappy:相当于list+apply

    lapply(X, FUN, ...)

    • X操作对象为向量或列表(vetor or list)
    • 默认返回一个列表

    sapply: 同lapply

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

    • 默认返回一个向量、矩阵或数组。

    vapply: 同sapply, 可以定义返回值的标签

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

    • FUN.VALUE:为一个向量,定义FUN返回值的模板(template)

    mapply: 是sapply的多变量版本

    mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)

    • 将FUN依次应用到参数...的每一个元素上。
    • 默认返回一个列表。
    x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
    # compute the list mean for each list element
    lapply(x, mean) 
    sapply(x, mean)
    
    # 比较sapply和vapply
    i39 <- sapply(3:9, seq)
    sapply(i39, fivenum)  # 计算5个分位值
    vapply(i39, fivenum, c(Min. = 0, "1st Qu." = 0, Median = 0, "3rd Qu." = 0, Max. = 0))
    
    
    # replicate基于sapply的函数,重复计算一个表达式,通常用于随机数生成。
    # replicate(n, expr, simplify = "array")
    
    replicate(100, mean(rexp(10)))
    hist(replicate(100, mean(rexp(10))))
    
    
    #mapply
    
    mapply(rep, 1:4, 4:1)
    rep(1:4, 4:1)
    mapply(rep, x = 1:4, times = 4:1)
    rep(x=1:4, times=4:1)
    
    head(cars)
    mapply(sum, cars$speed, cars$dist) #两列相加,对行求和
    mapply(sum, cars[,1], cars[,2])
    apply(cars, 1, sum)
    
    mapply(sum, cars[,1:2])#对列求和
    apply(cars, 2, sum)
    
    

    tapply 相当于table+apply

    tapply(X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE)

    • X操作对象为可以切割(split)的R对象。
    • INDEX为一个或多个因子的列表
    # 对数据集data.frame进行列联表操作
    head(warpbreaks)
    tapply(warpbreaks$breaks, warpbreaks[,-1], sum)
    tapply(warpbreaks$breaks, warpbreaks[, 3], sum)
    
    
    # 对tapply统计流程分解
    
    n <- 17; fac <- factor(rep_len(1:3, n), levels = 1:5)
    table(fac) #统计每个因子类型对应几个值
    tapply(1:n, fac, length) ## NA's
    tapply(1:n, fac, length, default = 0) # == table(fac)
    
    
    num <-1:17
    temp <- as.data.frame(cbind(num, fac))
    tapply(temp$num, temp$fac, sum)
    tapply(temp$num, fac, sum) #每个因子类型对应的值求和。
    
    

    相关文章

      网友评论

          本文标题:apply家族函数:数据分组统计

          本文链接:https://www.haomeiwen.com/subject/bohatrtx.html