美文网首页
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