[R]高级结构指令(lapply, sapply和apply)的用法

基本的程序语言都具备基本的控制结构指令,如if...else和for...loop,一般可做为操作向量数据的辅助工具。然而,当用于大数据的平行处理作业,切换为矩阵操作就显得相当重要,R语言中的高级数据结构指令即具备平行处理大数据的功能。

lapply: 输入资料结构为一个列表(list)和一个自订函数(fun),即可对列表中的数据进行平行计算和求值,输出资料结构为一个列表(list)。以一个列表(data1)和平均值函数(mean)作为范例,如下。

#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)来计算,范例如下。

#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指令来确认,如下。

#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)。范例如下。

#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

-----如果文章对您有帮助,打开微信扫一扫,请作者喝杯咖啡。-----

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章