京公网安备 11010802034615号
经营许可证编号:京B2-20210330
数据批处理--R语言里最重要的一个函数家族:*pply
之前我们讲过循环,简单讲解了向量计算,它可以代替循环进行比较搞笑的批量计算,试想计算数据框中的总收入加上10,我们没必要进行循环计算这一列的每一个元素与10的和,只需要把这一列当成一个向量执行就可以了,这就是向量计算,但是问题来了,如果我要数据框中所有列都加上10或者求所有列的均值、中位数又或对它们调用更加复杂的函数,该怎么办?第一个想到的还是循环,但是R里面循环很慢这时*pply家族的函数就派上用场了,专门完成比向量更高层次的批量处理。
apply函数
temp <- data.frame(a = rnorm(30, mean = 0), b = rnorm(30, 2), c = rnorm(30, 4))
apply(X = temp, MARGIN = 2, FUN = mean)
apply(temp, 2, sd)
apply(temp, 1, mean)
apply(temp, 2, function(x) length(x[x > 1]))
1行生成一个数据框,它每一列的数都是从一个正态分布中抽取的样本,描述一个正态分布的样本集至少要包含三个要素:样本数、均值mean、标准差sd,函数rnorm的参数也主要包含这三个要素,主要用于随机产生一个指定特征的正态分布样本集,这里a列表示随机抽取一个包含30个样本,均值为0,标准差为1(默认是1)的向量,然后赋值给a列,b为随机抽取一个包含30个样本均值为2的正态分布向量,c同样解释;为了验证抽样效果,我们可以求每一列的均值看看和设定的是否一样,这里不需要循环,只用apply函数即可,参数X(大写)用于指定数据集,MARGIN用于指定是对行计算还是对列计算,行用1表示,列2表示,也可以同时进行行和列计算,最后一个参数FUN指定调用的函数,连起来解释将temp中的每一列丢给mean函数计算求均值,可以看到第一列的均值接近0,第二列接近2,第三列接近4,和我们设定的一样;3行对每一列求标准差,可以看到标准差都接近1,和默认的标准差一样;4行对每一行求均值;5行使用了自编函数,这里是一个匿名函数,所谓匿名函数就是没有函数名,它统计x中大于1的个数,这句整体连起来是将temp的每一列丢给匿名函数,计算每一列中大于1的数值个数,有意思的是*pply家族大多数用于自编函数,进行一些批量的特殊操作。
除了对矩阵或者数据框进行操作以外,我们有时候还会用到对list的批量操作,这就需要用到lapply或者sapply函数了,
lapply函数
temp <- list(a = rnorm(30, mean = 0), b = rnorm(10, 2), c = rnorm(20, 4))
lapply(X = temp, FUN = length)
length(temp)
myfun <- function(x) {
a <- median(x)
b <- mean(x)
return(c(a, b))
}
lapply(temp, myfun)
1行创建了一个包含3个向量元素的list;2行使用lapply函数将list的每一个元素丢给length函数,统计每一个元素的长度,返回的结果是一个和X等长的list,包含3个计数结果;4行返回temp的长度为3;5行起编了一个自编函数myfun,它计算x的中位数和均值,并将结果捆绑为向量返回;最后一行将temp应用于自编函数myfun,返回计算结果,结果是一个list,和temp等长,包含三个向量,每个向量包含两个元素,即temp中每个向量的中位数和均值。
有时候我们需要向函数传递多个参数,然后进行批量操作,如下:
lapply传递多个参数
myfun2 <- function(x, y) {
a <- median(x + y)
b <- mean(x - y)
return(list(a, b))
}
b = 3
lapply(X = temp, myfun2, y = b)
1行设计了一个自编函数myfun2,它需要用户传递两个参数:x、y;最后一行使用lapply传递多个参数,只需要在FUN后面继续赋值FUN所需的参数就可以了,比如myfun2需要y参数,我们就在后面赋值y = b,这样就可以完成传参了,表示temp中每个元素向量都要和y一起参与计算,是整体的y不是y下面的每一元素,因为temp是按元素被lapply传递,而y不是,y是整体赋值。
sapply函数
sapply(X = temp, FUN = myfun, simplify = F)
sapply(X = temp, FUN = myfun, simplify = T)
sapply函数就是lapply的一个简化版本,因为它添加了simplify参数而更名为sapply,我们看到在simplify等于F时,它返回的结果和lapply一样是个list,当simplify为T时它就将结果整理成了一个矩阵,其实这个使用do.call函数也可以将lapply的结果转化为矩阵,后面应用到很多,原因是我已经忘了sapply函数。

另外一个传递多个参数进行建模的函数为mapply,这个函数很重要,一般在模型比较的交叉检验时经常用到,比如后面章节比较随机森林的树数对模型的影响时就用到了,它的一个作用就是避免多重循环,因为它和lapply的多参数传递不同,它是将多个参数的元素一一对应传递的。
mapply函数
x <- 1:3
y <- c(4, 2, 2)
z <- c(1, 3, 4)
myfun3 <- function(x, y, z) {
m <- y + z*x
}
mapply(myfun3, x, y, z)
lapply(x, myfun3, y = y, z = z)
前三行创建了三个向量,4行创建了一个自编函数myfun3;mapply函数将x、y、z的元素一一对应的传递给myfun3,返回的变量是一个向量,包含了3个元素,因为x、y、z的元素共产生了3次一一对应的关系,看到了么,如果你将要使用一个三重循环就可以使用这这种方法避免,速度快很多,具体用例请参看舆情监控的章节;而lapply返回的结果就比较复杂了,所以它们的传参逻辑不是一回事。
除了上面讲到的函数以外,*pply家族还有很多变种,什么ddply、vapply、rapply等等,大同小异根本没必要记忆,因为上面的函数足够完成它们的工作,比如tapply函数比较像分组函数,可以使用之前的透视表函数替代他,更加方便。其实一旦你搞通了之后,就会发现很多函数都是浮云,我仅仅用到两个*pply函数lapply和mapply,其他的都被其他函数替代掉了。数据分析师培训
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据分析、业务监控、运营复盘等场景中,列值趋势计算是核心需求之一。无论是分析销售额的月度增长、用户活跃的变化趋势、库存 ...
2026-06-12在数字经济深度渗透的当下,消费者的购买行为已从过去的 “被动接受” 转变为 “主动决策”。流量红利消退、获客成本攀升、用户 ...
2026-06-12CDA三级认证是三个级别中的塔尖,全面考察数据战略、团队领导和复杂项目的综合能力。它所对应的《敏捷数据挖掘》教材,不再局限 ...
2026-06-12在游戏产业的商业逻辑中,付费玩家是支撑游戏生存与发展的核心支柱。行业普遍遵循 “二八定律”:20% 的付费玩家贡献了游戏 80% ...
2026-06-11【核心关键词】企业、定位、传统、产品、互联网、可视化、业务侧、数字化、结构化、数据分析、传统制造业、市场状态、发展空间 ...
2026-06-11 解读《CDA二级教材:量化策略分析(2025)》的全景结构与学习逻辑 ” CDA二级认证是企业招聘数据分析师时最常提及的证书门槛 ...
2026-06-11【核心关键词】药企、可视化、营销、分类、数据分析师、销售数据、业务人员、指导方向、分析报告、营销数据、营销医生 【专访摘 ...
2026-06-10在统计学分析、问卷调研、实验验证、业务复盘等场景中,卡方检验与 T 检验是应用最广泛的两类基础假设检验方法。前者专门处理分 ...
2026-06-10 很多数据分析师每天都在计算指标、制作报表,但当被问到“什么叫指标数据元”“指标数据标准包含哪些核心维度”“指标数据质 ...
2026-06-10在MySQL数据库日常查询、数据统计、后台接口开发、数据导出等场景中,开发者经常需要查询数据表除某几列之外的所有字段。例如查 ...
2026-06-09在Python网络请求、爬虫开发、接口测试、数据抓取等实操场景中,requests库是最常用的第三方请求工具,而content属性是requests ...
2026-06-09 数据分析正在重塑每一个行业。CDA认证的三本官方教材,分别对应Level I、Level II、Level III,为你铺就从业务数据分析到数 ...
2026-06-09在数字财务、智慧财税、业财融合深度推进的当下,传统财务模式下数据标准混乱、业务流程碎片化、知识无法沉淀、系统互通性差等问 ...
2026-06-08随着数字经济深度渗透各行各业,数据正式成为继土地、劳动力、资本、技术之后的第五大生产要素,是企业数字化转型、精细化运营、 ...
2026-06-08 很多数据分析师能熟练写SQL、做透视表,但当被问到“数据是从哪里来的?经过哪些加工才进入数据仓库?ETL具体做了什么?”时 ...
2026-06-08【核心关键词】贷款、报表、课程、专业、建模、缺失值、营销、互联网、银行、办公自动化、数据分析、数据预处理、特征工程、贷 ...
2026-06-05在数据库数据查询、业务报表统计、多表关联分析中,LEFT JOIN左连接是使用率最高的SQL关联查询语句。其核心特性是保留左表全部数 ...
2026-06-05 很多数据分析师能熟练地写SQL、做透视表、算描述性统计,但当被问到“如何预测用户流失概率”“如何归因销量下滑的关键因素 ...
2026-06-05任何一款产品从诞生、普及到最终退出市场,都会遵循一套固定的发展规律,这就是产品生命周期理论。在市场竞争日益激烈、产品迭代 ...
2026-06-04在Excel数据分析、办公统计、业务报表制作场景中,数据透视表是数据汇总、分类统计、快速复盘的核心工具,能够高效完成海量原始 ...
2026-06-04