数据批处理--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
在当今这个数据驱动的时代,几乎每一个业务决策都离不开对数据的深入分析。而其中,指标波动归因分析更是至关重要的一环。无论是 ...
2025-02-18当数据开始说谎:那些年我们交过的学费 你有没有经历过这样的场景?熬了三个通宵做的数据分析报告,在会议上被老板一句"这数据靠 ...
2025-02-17数据分析作为一门跨学科领域,融合了统计学、编程、业务理解和可视化技术。无论是初学者还是有一定经验的从业者,系统化的学习路 ...
2025-02-17挖掘用户价值本质是让企业从‘赚今天的钱’升级为‘赚未来的钱’,同时让用户从‘被推销’变为‘被满足’。询问deepseek关于挖 ...
2025-02-17近来deepseek爆火,看看deepseek能否帮我们快速实现数据看板实时更新。 可以看出这对不知道怎么动手的小白来说是相当友好的, ...
2025-02-14一秒精通 Deepseek,不用找教程,不用买资料,更不用报一堆垃圾课程,所有这么去做的,都是舍近求远,因为你忽略了 deepseek 的 ...
2025-02-12自学 Python 的关键在于高效规划 + 实践驱动。以下是一份适合零基础快速入门的自学路径,结合资源推荐和实用技巧: 一、快速入 ...
2025-02-12“我们的利润率上升了,但销售额却没变,这是为什么?” “某个业务的市场份额在下滑,到底是什么原因?” “公司整体业绩 ...
2025-02-08活动介绍 为了助力大家在数据分析领域不断精进技能,我们特别举办本期打卡活动。在这里,你可以充分利用碎片化时间在线学习,让 ...
2025-02-071、闺女,醒醒,媒人把相亲的带来了。 我。。。。。。。 2、前年春节相亲相了40个, 去年春节相亲50个, 祖宗,今年你想相多少个 ...
2025-02-06在数据科学的广阔领域中,统计分析与数据挖掘占据了重要位置。尽管它们常常被视为有关联的领域,但两者在理论基础、目标、方法及 ...
2025-02-05在数据分析的世界里,“对比”是一种简单且有效的方法。这就像两个女孩子穿同一款式的衣服,效果不一样。 很多人都听过“货比三 ...
2025-02-05当我们只有非常少量的已标记数据,同时有大量未标记数据点时,可以使用半监督学习算法来处理。在sklearn中,基于图算法的半监督 ...
2025-02-05考虑一种棘手的情况:训练数据中大部分样本没有标签。此时,我们可以考虑使用半监督学习方法来处理。半监督学习能够利用这些额 ...
2025-02-04一、数学函数 1、取整 =INT(数字) 2、求余数 =MOD(除数,被除数) 3、四舍五入 =ROUND(数字,保留小数位数) 4、取绝对值 =AB ...
2025-02-03作者:CDA持证人 余治国 一般各平台出薪资报告,都会哀嚎遍野。举个例子,去年某招聘平台发布《中国女性职场现状调查报告》, ...
2025-02-02真正的数据分析大神是什么样的呢?有人认为他们能轻松驾驭各种分析工具,能够从海量数据中找到潜在关联,或者一眼识别报告中的数 ...
2025-02-01现今社会,“转行”似乎成无数职场人无法回避的话题。但行业就像座围城:外行人看光鲜,内行人看心酸。数据分析这个行业,近几年 ...
2025-01-31本人基本情况: 学校及专业:厦门大学经济学院应用统计 实习经历:快手数据分析、字节数据分析、百度数据分析 Offer情况:北京 ...
2025-01-3001专家简介 徐杨老师,CDA数据科学研究院教研副总监,主要负责CDA认证项目以及机器学习/人工智能类课程的研发与授课,负责过中 ...
2025-01-29