
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
基于 SPSS 的 ROC 曲线平滑调整方法与实践指南 摘要 受试者工作特征曲线(ROC 曲线)是评估诊断模型或预测指标效能的核心工具, ...
2025-08-25神经网络隐藏层神经元个数的确定方法与实践 摘要 在神经网络模型设计中,隐藏层神经元个数的确定是影响模型性能、训练效率与泛 ...
2025-08-25CDA 数据分析师与数据思维:驱动企业管理升级的核心力量 在数字化浪潮席卷全球的当下,数据已成为企业继人力、物力、财力之后的 ...
2025-08-25CDA数据分析师与数据指标:基础概念与协同逻辑 一、CDA 数据分析师:数据驱动时代的核心角色 1.1 定义与行业价值 CDA(Certified ...
2025-08-22Power Query 移动加权平均计算 Power Query 移动加权平均设置全解析:从原理到实战 一、移动加权平均法的核心逻辑 移动加权平均 ...
2025-08-22描述性统计:CDA数据分析师的基础核心与实践应用 一、描述性统计的定位:CDA 认证的 “入门基石” 在 CDA(Certified Data Analy ...
2025-08-22基于 Python response.text 的科技新闻数据清洗去噪实践 在通过 Python requests 库的 response.text 获取 API 数据后,原始数据 ...
2025-08-21基于 Python response.text 的科技新闻综述 在 Python 网络爬虫与 API 调用场景中,response.text 是 requests 库发起请求后获取 ...
2025-08-21数据治理新浪潮:CDA 数据分析师的战略价值与驱动逻辑 一、数据治理的多维驱动引擎 在数字经济与人工智能深度融合的时代,数据治 ...
2025-08-21Power BI 热力地图制作指南:从数据准备到实战分析 在数据可视化领域,热力地图凭借 “直观呈现数据密度与分布趋势” 的核心优势 ...
2025-08-20PyTorch 矩阵运算加速库:从原理到实践的全面解析 在深度学习领域,矩阵运算堪称 “计算基石”。无论是卷积神经网络(CNN)中的 ...
2025-08-20数据建模:CDA 数据分析师的核心驱动力 在数字经济浪潮中,数据已成为企业决策的核心资产。CDA(Certified Data Analyst)数据分 ...
2025-08-20KS 曲线不光滑:模型评估的隐形陷阱,从原因到破局的全指南 在分类模型(如风控违约预测、电商用户流失预警、医疗疾病诊断)的评 ...
2025-08-20偏态分布:揭开数据背后的非对称真相,赋能精准决策 在数据分析的世界里,“正态分布” 常被视为 “理想模型”—— 数据围绕均值 ...
2025-08-19CDA 数据分析师:数字化时代的价值创造者与决策智囊 在数据洪流席卷全球的今天,“数据驱动” 已从企业战略口号落地为核心 ...
2025-08-19CDA 数据分析师:善用 Power BI 索引列,提升数据处理与分析效率 在 Power BI 数据分析流程中,“数据准备” 是决定后续分析质量 ...
2025-08-18CDA 数据分析师:巧用 SQL 多个聚合函数,解锁数据多维洞察 在企业数据分析场景中,单一维度的统计(如 “总销售额”“用户总数 ...
2025-08-18CDA 数据分析师:驾驭表格结构数据的核心角色与实践应用 在企业日常数据存储与分析场景中,表格结构数据(如 Excel 表格、数据库 ...
2025-08-18PowerBI 累计曲线制作指南:从 DAX 度量到可视化落地 在业务数据分析中,“累计趋势” 是衡量业务进展的核心视角 —— 无论是 “ ...
2025-08-15Python 函数 return 多个数据:用法、实例与实战技巧 在 Python 编程中,函数是代码复用与逻辑封装的核心载体。多数场景下,我们 ...
2025-08-15