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
大咖简介: 刘凯,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