京公网安备 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-03-06在数据分析、数据预处理场景中,dat文件是一种常见的二进制或文本格式数据文件,广泛应用于科研数据、工程数据、传感器数据等领 ...
2026-03-06在数据驱动决策的时代,CDA(Certified Data Analyst)数据分析师的核心价值,早已超越单纯的数据清洗与统计分析,而是通过数据 ...
2026-03-06在教学管理、培训数据统计、课程体系搭建等场景中,经常需要对课时数据进行排序并实现累加计算——比如,按课程章节排序,累加各 ...
2026-03-05在数据分析场景中,环比是衡量数据短期波动的核心指标——它通过对比“当前周期与上一个相邻周期”的数据,直观反映指标的月度、 ...
2026-03-05数据治理是数字化时代企业实现数据价值最大化的核心前提,而CDA(Certified Data Analyst)数据分析师作为数据全生命周期的核心 ...
2026-03-05在实验检测、质量控制、科研验证等场景中,“方法验证”是确保检测/分析结果可靠、可复用的核心环节——无论是新开发的检测方法 ...
2026-03-04在数据分析、科研实验、办公统计等场景中,我们常常需要对比两组数据的整体差异——比如两种营销策略的销售额差异、两种实验方案 ...
2026-03-04在数字化转型进入深水区的今天,企业对数据的依赖程度日益加深,而数据治理体系则是企业实现数据规范化、高质量化、价值化的核心 ...
2026-03-04在深度学习,尤其是卷积神经网络(CNN)的实操中,转置卷积(Transposed Convolution)是一个高频应用的操作——它核心用于实现 ...
2026-03-03在日常办公、数据分析、金融理财、科研统计等场景中,我们经常需要计算“平均值”来概括一组数据的整体水平——比如计算月度平均 ...
2026-03-03在数字化转型的浪潮中,数据已成为企业最核心的战略资产,而数据治理则是激活这份资产价值的前提——没有规范、高质量的数据治理 ...
2026-03-03在Excel办公中,数据透视表是汇总、分析繁杂数据的核心工具,我们常常通过它快速得到销售额汇总、人员统计、业绩分析等关键结果 ...
2026-03-02在日常办公和数据分析中,我们常常需要探究两个或多个数据之间的关联关系——比如销售额与广告投入是否正相关、员工出勤率与绩效 ...
2026-03-02在数字化运营中,时间序列数据是CDA(Certified Data Analyst)数据分析师最常接触的数据类型之一——每日的营收、每小时的用户 ...
2026-03-02在日常办公中,数据透视表是Excel、WPS等表格工具中最常用的数据分析利器——它能快速汇总繁杂数据、挖掘数据关联、生成直观报表 ...
2026-02-28有限元法(Finite Element Method, FEM)作为工程数值模拟的核心工具,已广泛应用于机械制造、航空航天、土木工程、生物医学等多 ...
2026-02-28在数字化时代,“以用户为中心”已成为企业运营的核心逻辑,而用户画像则是企业读懂用户、精准服务用户的关键载体。CDA(Certifi ...
2026-02-28在Python面向对象编程(OOP)中,类方法是构建模块化、可复用代码的核心载体,也是实现封装、继承、多态特性的关键工具。无论是 ...
2026-02-27在MySQL数据库优化中,索引是提升查询效率的核心手段—— 面对千万级、亿级数据量,合理创建索引能将查询时间从秒级压缩到毫秒级 ...
2026-02-27