京公网安备 11010802034615号
经营许可证编号:京B2-20210330
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
在数据分析、计量研究等场景中,回归分析是探究变量间量化关系的核心方法,无论是简单的一元线性回归,还是复杂的多元线性回归、 ...
2026-05-07在数据分析、计量研究等场景中,回归分析是探究变量间量化关系的核心方法,无论是简单的一元线性回归,还是复杂的多元线性回归、 ...
2026-05-07 很多数据分析师画过趋势图、做过业绩预测,但当被问到“这个月销售额增长20%,到底是长期趋势自然增长,还是促销活动的短期 ...
2026-05-07在数字化时代,商业竞争的核心已从“经验驱动”转向“数据驱动”,越来越多的企业意识到,商业分析不是简单的数据统计与报表呈现 ...
2026-05-06在Excel数据透视表的实操中,“引用”是连接透视表与公式、辅助数据的核心操作,而相对引用作为最基础、最常用的引用方式,其设 ...
2026-05-06 很多数据分析师做过按月份的销售额趋势图,画过按天的流量折线图,但当被问到“时间序列和普通数据有什么本质区别”“季节性 ...
2026-05-06在Excel数据分析中,数据透视表是汇总、整理海量数据的高效工具,而公式则是实现数据二次计算、逻辑判断的核心功能。实际操作中 ...
2026-04-30Excel透视图是数据分析中不可或缺的工具,它能将透视表中的数据快速可视化,帮助我们直观捕捉数据规律、呈现分析结果。但在实际 ...
2026-04-30 很多数据分析师能熟练地计算指标、搭建标签体系,但当被问到“画像到底在解决什么问题”“画像和标签是什么关系”“画像如何 ...
2026-04-30在中介效应分析中,人口统计学变量(如年龄、性别、学历、收入、职业等)是常见的控制变量或调节变量,其处理方式直接影响分析结 ...
2026-04-29在SQL数据库实操中,日期数据的存储与显示是高频需求,而“数字日期”(如20240520、20241231、45321)是很多开发者、数据分析师 ...
2026-04-29 很多分析师在设计标签时思路清晰,但真到落地环节却面临“数据在手,不知如何转化为可用标签”的困境:或因加工方式选择不当 ...
2026-04-29在手游行业竞争日趋白热化的当下,“流量为王”早已升级为“留存为王”,而付费用户留存率更是衡量一款手游盈利能力、运营质量的 ...
2026-04-28在日常MySQL数据库运维与开发中,经常会遇到“同一台服务器上,两个不同数据库(以下简称“源库”“目标库”)的表数据需要保持 ...
2026-04-28 很多分析师每天和数据打交道,但当被问到“标签是什么”“标签和指标有什么区别”“标签体系如何设计”时,却常常答不上来。 ...
2026-04-28箱线图(Box Plot)作为一种经典的数据可视化工具,广泛应用于统计学、数据分析、科研实证等领域,核心价值在于直观呈现数据的集 ...
2026-04-27实证分析是社会科学、自然科学、经济管理等领域开展研究的核心范式,其核心逻辑是通过对多维度数据的收集、分析与解读,揭示变量 ...
2026-04-27 很多数据分析师精通Excel函数和数据透视表,但当被问到“数据从哪里来”“表和视图有什么区别”“数据库管理系统和SQL是什么 ...
2026-04-27在大数据技术飞速迭代、数字营销竞争日趋激烈的今天,“精准触达、高效转化、成本可控”已成为企业营销的核心诉求。传统广告投放 ...
2026-04-24在游戏行业竞争白热化的当下,用户流失已成为制约游戏生命周期、影响营收增长的核心痛点。据行业报告显示,2024年移动游戏平均次 ...
2026-04-24