
R語言中的幾類高效函數
在執(zhí)行R語言任務時,一個提高執(zhí)行效率的思路就是盡量避免使用循環(huán)語句,否則你的工作將變的緩慢低效。事實上,我們是可以有辦法使用一些較高級的函數來盡量避免使用循環(huán)工作的。下面本文將介紹常見的幾種高效函數。
目錄
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代替循環(huán)函數
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循環(huán)結果就算結果,發(fā)現是一致的
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函數用于對給定的輸入數據做批量的計算,主要參數有數據、統(tǒng)計方向、計算參數、計算函數。其中統(tǒng)計方向可取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函數
還有一些函數也是基于行和列進行統(tǒng)計計算的,如對列進行計算的有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
SQL Server 中 CONVERT 函數的日期轉換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數據處理中,日期格式轉換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關聯查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數據庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數據分析師:表結構數據 “獲取 - 加工 - 使用” 全流程的賦能者 表結構數據(如數據庫表、Excel 表、CSV 文件)是企業(yè)數字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數據分析師:解鎖表結構數據特征價值的專業(yè)核心 表結構數據(以 “行 - 列” 規(guī)范存儲的結構化數據,如數據庫表、Excel 表、 ...
2025-09-17Excel 導入數據含缺失值?詳解 dropna 函數的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數據時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數據分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數據差異是否 “ ...
2025-09-16CDA 數據分析師:掌控表格結構數據全功能周期的專業(yè)操盤手 表格結構數據(以 “行 - 列” 存儲的結構化數據,如 Excel 表、數據 ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數據分析師:激活表格結構數據價值的核心操盤手 表格結構數據(如 Excel 表格、數據庫表)是企業(yè)最基礎、最核心的數據形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調用、數據爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數據的科學計數法問題 為幫助 Python 數據從業(yè)者解決pd.read_csv讀取長浮點數據時的科學計數法問題 ...
2025-09-12CDA 數據分析師:業(yè)務數據分析步驟的落地者與價值優(yōu)化者 業(yè)務數據分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數據把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數據驅動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數據分析師與戰(zhàn)略 / 業(yè)務數據分析:概念辨析與協(xié)同價值 在數據驅動決策的體系中,“戰(zhàn)略數據分析”“業(yè)務數據分析” 是企業(yè) ...
2025-09-11Excel 數據聚類分析:從操作實踐到業(yè)務價值挖掘 在數據分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數據中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數據解讀到決策支撐的價值導向 統(tǒng)計模型作為數據分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10