R语言中的几类高效函数
在执行R语言任务时,一个提高执行效率的思路就是尽量避免使用循环语句,否则你的工作将变的缓慢低效。事实上,我们是可以有办法使用一些较高级的函数来尽量避免使用循环工作的。下面本文将介绍常见的几种高效函数。
目录
1.apply函数
2.lapply函数
3.sapply函数
4.tapply函数
5.sweep函数
6.column函数和row函数
1)apply函数
apply函数主要应用在一个数组或者矩阵上,通过给定的函数,并根据指定的计算方向(按行或按列),以该方向的数组为输入对象,反回计算结果,并将结果存储于一个数组或向量中。
apply(array, margin, function, ...)
首先定义一个矩阵data
data <- matrix(rep(seq(4), 4), ncol = 4)
data
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 2 2 2 2
[3,] 3 3 3 3
[4,] 4 4 4 4
#先根据行求和,其中1为指定按行计算(1为行,2为列),sum为指定的function
apply(data, 1, sum)
[1] 4 8 12 16
#根据列求和,其中2为按列计算
apply(data, 2, sum)
[1] 10 10 10 10
#使用自定义函数,首先定义函数myfun
myfun <- function(x){
+ sum(x) + 2
+ }
#根据自定义函数,使用apply函数计算
apply(data, 1, myfun)
[1] 6 10 14 18
#自定义函数还可以写在apply函数内部,不过需要注意,没有大括号
apply(data, 1, function(x) sum(x) + 2)
[1] 6 10 14 18
#更通用的,可以将函数写出如下形势
apply(data, 1, function(x, y) sum(x) + y, y=2)
[1] 6 10 14 18
2)lapply函数
lapply用于对给定的数据,分别对其中的元素按指定的函数计算,并返回一个list。对于数据框来说,lapply函数显得极为友好,在data.frame中,每个变量可以看做是一个元素,因此lapply应用于data.frame时,可以同时对所有变量按指定函数进行计算。
#首先构造一个数据框
data.df<-data.frame(data)
> data.df
X1 X2 X3 X4
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
#对数据框所有变量进行求和,返回每个变量的结果,存储形式为list。
lapply(data.df, sum)
$X1
[1] 10
$X2
[1] 10
$X3
[1] 10
$X4
[1] 10
#此外,还可以将传入的函数改成自定义的函数。要注意,函数形式没有大括号。
y1 <- lapply(data.df, function(x, y) sum(x) + y, y = 5)
y1
$X1
[1] 15
$X2
[1] 15
$X3
[1] 15
$X4
[1] 15
#使用lappy代替循环函数
unlist(lapply(1:5, function(i) print(i) ))
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 1 2 3 4 5
#对比一下for循环结果就算结果,发现是一致的
for(i in 1:5) print(i)
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
3)sapply函数
sapply函数与lapply函数类似,主要输入的参数都是数据和函数,但sapply与lapply不同的是sapply返回的是向量,而lapply返回的是一个list。并且sapply还存在第三个参数simplify,当silmplify为FALSE时,那么sapply返回的结果和lapply一致;当silmplify为TRUE时,sapply返回的结果为一个向量或者矩阵;此外还可以设定其它格式。
sapply(list, function, ..., simplify)
y <- sapply(data.df, function(x, y) sum(x) + y, y = 5)
y
X1 X2 X3 X4
15 15 15 15
is.vector(y)
[1] TRUE #返回的结果是一个向量
#定义simply=F,此时返回的结果胃list,效果和apply一样。
y <- sapply(data.df, function(x, y) sum(x) + y, y = 5,simplify = F)
y
$X1
[1] 15
$X2
[1] 15
$X3
[1] 15
$X4
[1] 15
class(y)
[1] "list"
is.list(y)
[1] TRUE#返回结果为list
4)tapply函数
tapply用于对数据进行分组计算,类似于SQL中的group by。tapply需要传入三个参数,第一个是数据,第二个是数据的分组,第三个参数是指定的计算函数。
data.df<-data.frame(x=runif(10),group1=rep(1:5,2),group2=rep(1:2,5))
data.df
x group1 group2
1 0.68180046 1 1
2 0.72726914 2 2
3 0.33735976 3 1
4 0.48212394 4 2
5 0.04234556 5 1
6 0.88701919 1 2
7 0.53946995 2 1
8 0.01295496 3 2
9 0.47062069 4 1
10 0.87079649 5 2
tapply(data.df$x, data.df$group1, mean)
1 2 3 4 5
0.4926077 0.7726152 0.6058755 0.6110971 0.3074988
#此处还可以传入两个分组的计算结果
tapply(data.df$x, list(data.df$group1,data.df$group2), mean)
1 2
1 0.68180046 0.88701919
2 0.53946995 0.72726914
3 0.33735976 0.01295496
4 0.47062069 0.48212394
5 0.04234556 0.87079649
5)sweep函数
sweep函数用于对给定的输入数据做批量的计算,主要参数有数据、统计方向、计算参数、计算函数。其中统计方向可取1或2,取1表示在行的方向上计算,2表示在列的方向上计算。计算函数为加减乘除等算是,默认为减法'-'。
data<-matrix(runif(20),5)
data.df<-data.frame(data)
data.df
X1 X2 X3 X4
1 0.09248257 0.4358975 0.1884430 0.1212183
2 0.83091974 0.2388490 0.8377123 0.6140257
3 0.15849016 0.2286257 0.8577217 0.9877683
4 0.86437393 0.2771434 0.5302898 0.1608113
5 0.43098913 0.5906199 0.1117341 0.2846628
#将数据按行计算,每行分别减去各行的最大值
sweep(data.df,1,apply(data.df,1,max),'-')
X1 X2 X3 X4
1 -0.343414887 0.0000000 -0.2474544 -0.3146792
2 -0.006792557 -0.5988633 0.0000000 -0.2236865
3 -0.829278179 -0.7591426 -0.1300467 0.0000000
4 0.000000000 -0.5872305 -0.3340842 -0.7035627
5 -0.159630747 0.0000000 -0.4788858 -0.3059571
6)column函数和row函数
还有一些函数也是基于行和列进行统计计算的,如对列进行计算的有colMeans和colSums;对行计算的rowMeans和rowSums。
data.df
X1 X2 X3 X4
1 0.09248257 0.4358975 0.1884430 0.1212183
2 0.83091974 0.2388490 0.8377123 0.6140257
3 0.15849016 0.2286257 0.8577217 0.9877683
4 0.86437393 0.2771434 0.5302898 0.1608113
5 0.43098913 0.5906199 0.1117341 0.2846628
#对列求平均
colMeans(data.df)
X1 X2 X3 X4
0.4754511 0.3542271 0.5051802 0.4336973
#对列求和
X1 X2 X3 X4
2.377256 1.771135 2.525901 2.168486
#对行求和
rowSums(data.df)
[1] 0.8380414 2.5215068 2.2326058 1.8326183 1.4180059
#对行求平均
rowMeans(data.df)
[1] 0.2095103 0.6303767 0.5581515 0.4581546 0.3545015
数据分析咨询请扫描二维码
若不方便扫码,搜微信号: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