数据批处理--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
大咖简介: 刘凯,CDA大咖汇特邀讲师,DAMA中国分会理事,香港金管局特聘数据管理专家,拥有丰富的行业经验。本文将从数据要素 ...
2025-04-22CDA持证人简介 刘伟,美国 NAU 大学计算机信息技术硕士, CDA数据分析师三级持证人,现任职于江苏宝应农商银行数据治理岗。 学 ...
2025-04-21持证人简介:贺渲雯 ,CDA 数据分析师一级持证人,互联网行业数据分析师 今天我将为大家带来一个关于用户私域用户质量数据分析 ...
2025-04-18一、CDA持证人介绍 在数字化浪潮席卷商业领域的当下,数据分析已成为企业发展的关键驱动力。为助力大家深入了解数据分析在电商行 ...
2025-04-17CDA持证人简介:居瑜 ,CDA一级持证人,国企财务经理,13年财务管理运营经验,在数据分析实践方面积累了丰富的行业经验。 一、 ...
2025-04-16持证人简介: CDA持证人刘凌峰,CDA L1持证人,微软认证讲师(MCT)金山办公最有价值专家(KVP),工信部高级项目管理师,拥有 ...
2025-04-15持证人简介:CDA持证人黄葛英,ICF国际教练联盟认证教练,前字节跳动销售主管,拥有丰富的行业经验。在实际生活中,我们可能会 ...
2025-04-14在 Python 编程学习与实践中,Anaconda 是一款极为重要的工具。它作为一个开源的 Python 发行版本,集成了众多常用的科学计算库 ...
2025-04-14随着大数据时代的深入发展,数据运营成为企业不可或缺的岗位之一。这个职位的核心是通过收集、整理和分析数据,帮助企业做出科 ...
2025-04-11持证人简介:CDA持证人黄葛英,ICF国际教练联盟认证教练,前字节跳动销售主管,拥有丰富的行业经验。 本次分享我将以教培行业为 ...
2025-04-11近日《2025中国城市长租市场发展蓝皮书》(下称《蓝皮书》)正式发布。《蓝皮书》指出,当前我国城市住房正经历从“增量扩张”向 ...
2025-04-10在数字化时代的浪潮中,数据已经成为企业决策和运营的核心。每一位客户,每一次交易,都承载着丰富的信息和价值。 如何在海量客 ...
2025-04-09数据是数字化的基础。随着工业4.0的推进,企业生产运作过程中的在线数据变得更加丰富;而互联网、新零售等C端应用的丰富多彩,产 ...
2025-04-094月7日,美国关税政策对全球金融市场的冲击仍在肆虐,周一亚市早盘,美股股指、原油期货、加密货币、贵金属等资产齐齐重挫,市场 ...
2025-04-08背景 3月26日,科技圈迎来一则重磅消息,苹果公司宣布向浙江大学捐赠 3000 万元人民币,用于支持编程教育。 这一举措并非偶然, ...
2025-04-07在当今数据驱动的时代,数据分析能力备受青睐,数据分析能力频繁出现在岗位需求的描述中,不分岗位的任职要求中,会特意标出“熟 ...
2025-04-03在当今数字化时代,数据分析师的重要性与日俱增。但许多人在踏上这条职业道路时,往往充满疑惑: 如何成为一名数据分析师?成为 ...
2025-04-02最近我发现一个绝招,用DeepSeek AI处理Excel数据简直太爽了!处理速度嘎嘎快! 平常一整天的表格处理工作,现在只要三步就能搞 ...
2025-04-01你是否被统计学复杂的理论和晦涩的公式劝退过?别担心,“山有木兮:统计学极简入门(Python)” 将为你一一化解这些难题。课程 ...
2025-03-31在电商、零售、甚至内容付费业务中,你真的了解你的客户吗? 有些客户下了一两次单就消失了,有些人每个月都回购,有些人曾经是 ...
2025-03-31