基本的程序語言都具備基本的控制結構指令,如if...else和for...loop,一般可做為操作向量數據的輔助工具。然而,當用於大數據的平行處理作業,切換為矩陣操作就顯得相當重要,R語言中的高級數據結構指令即具備平行處理大數據的功能。
lapply: 輸入資料結構為一個列表(list)和一個自訂函數(fun),即可對列表中的數據進行平行計算和求值,輸出資料結構為一個列表(list)。以一個列表(data1)和平均值函數(mean)作為範例,如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #data data1<-list(num=c(1:5), name=c(10,20,30),mat=matrix(1:15,nrow = 3,ncol = 5)) #result cal1<-lapply(data1, mean) #輸出結果 > cal1 $num [1] 3 $name [1] 20 $mat [1] 8 |
也可以進一步用自訂函數(fun)來計算,範例如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #function f<-function(x){x/5} #data data1<-list(num=c(1:5), name=c(10,20,30),mat=matrix(1:15,nrow = 3,ncol = 5)) #result cal2<-lapply(data1, f) #輸出結果 > cal2 $num [1] 0.2 0.4 0.6 0.8 1.0 $name [1] 2 4 6 $mat [,1] [,2] [,3] [,4] [,5] [1,] 0.2 0.8 1.4 2.0 2.6 [2,] 0.4 1.0 1.6 2.2 2.8 [3,] 0.6 1.2 1.8 2.4 3.0 |
sapply: 與lapply使用方式相似,輸入資料結構為一個列表(list)和一個自訂函數(fun),唯輸出資料結構為向量(vector)。為了確認數據類型,可用class指令來確認,如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #data data1<-list(num=c(1:5), name=c(10,20,30),mat=matrix(1:15,nrow = 3,ncol = 5)) cal1<-lapply(data1, mean) cal3<-sapply(data1, mean) #輸出結果 > cal1 $num [1] 3 $name [1] 20 $mat [1] 8 > cal3 num name mat 3 20 8 > class(cal1) [1] "list" > class(cal3) [1] "numeric" |
apply: 輸入資料結構為一個矩陣(matrix)和一個自訂函數(fun),輸出資料結構為一個向量(vector)或矩陣(matrix)。範例如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #function f<-function(x){x/5} data2<-matrix(c(1:30),nrow=6,ncol=5) #col calculation result cal4<-apply(data2,2, f) #col mean result cal5<-apply(data2,2, mean) #row mean result cal6<-apply(data2,1, mean) #輸出結果 > data2 [,1] [,2] [,3] [,4] [,5] [1,] 1 7 13 19 25 [2,] 2 8 14 20 26 [3,] 3 9 15 21 27 [4,] 4 10 16 22 28 [5,] 5 11 17 23 29 [6,] 6 12 18 24 30 > cal4 [,1] [,2] [,3] [,4] [,5] [1,] 0.2 1.4 2.6 3.8 5.0 [2,] 0.4 1.6 2.8 4.0 5.2 [3,] 0.6 1.8 3.0 4.2 5.4 [4,] 0.8 2.0 3.2 4.4 5.6 [5,] 1.0 2.2 3.4 4.6 5.8 [6,] 1.2 2.4 3.6 4.8 6.0 > cal5 [1] 3.5 9.5 15.5 21.5 27.5 > cal6 [1] 13 14 15 16 17 18 |
-----如果文章對您有幫助,打開微信掃一掃,請作者喝杯咖啡。-----