啊啊啊啊啊吖

2018-10-25   阅读量: 704

数据分析师 SAS

R里的apply、sapply、tapply函数的区别

1、apply函数
对一个Matrix或者Array进行某个维度的运算。其格式是:
apply(数据,维度Index,运算函数,函数的参数)
对于Matrix来说,其维度值为2,第二个参数维度Index中,1表示按行运算,2表示按列运算。例子:
> m<-matrix(1:6,2,3)> m [,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6> apply(m,2,sum) #维度Index=2,计算每一列的sum值[1] 3 7 11 注:
如果是DataFrame,那么系统会将其转为Matrix,如果所有Column不是数字类型或者类型不一致,导致转换失败,那么apply是运算不出任何一列的结果。这时候应该使用lappy()函数
2.lappy函数
针对list,我们可以使用lapply函数。
其调用如下:lapply(数据,运算函数,函数的参数)
对于DataFrame来说,如果不同的列有不同的数据类型,不能转换成Matrix,但是却可以转换成List,然后使用lapply函数。
例子:建立一个shop_id,saled,take_out和delivery_time的Data Frame,然后只统计平均saled,平均外送费用和平均外送时间。由于shop_id列不是数值类型,所以无法算平均值,所以我们可以对非数值的数据只取count数量。这里需自定义函数。
>wm<-read.csv(“testwaimai.csv”)>attach(wm) >s<-data.frame(shop_id,saled,takeout_cost,delivery_time)>as.character(shop_id)>lapply(s,function(x){if(is.numeric(x)){mean(x)}else{length(x)}}) shopid[1]52saled[1] 656.1154 takeoutcost[1]3.673077delivery_time[1] 39.34615
3. sapply函数
sapply函数和Lapply函数类似,也是对List进行处理,只是在返回结果上,sapply会根据结果的数据类型和结构,重新构建一个合理的数据类型返回。调用格式如下:
sapply(数据,运算函数,函数的参数,simplify = TRUE, USE.NAMES = TRUE)
> sapply(s,function(x){if(is.numeric(x)) {mean(x)} else {length(x)}}) shop_id saled takeout_cost delivery_time 52.000000 656.115385 3.673077 39.346154
4、tapply( )函数
tapply是对向量中的数据进行分组处理,而非对整体数据进行处理。
调用格式:
tapply(向量数据,分组标识,运算函数,函数的参数,simplify = TRUE)
例1> s<-data.frame(name=c("Devin","Edward","Lulu","Jeneen"),age=c(30,33,29,32),score=c(95,99,90,88),class=c(1,2,1,2),gender=c("M","M","F","F"))> s name age score class gender1 Devin 30 95 1 M2 Edward 33 99 2 M3 Lulu 29 90 1 F4 Jeneen 32 88 2 F

> tapply(sscore,sclass,mean) #计算每个班平均成绩

1 2

92.5 93.5

> tapply(sscore,sgender,mean) #计算男女生的平均成绩

F M

89 97

> tapply(sscore,list(sclass,s$gender),mean) #按照class和gender来计算平均成绩

F M

1 90 95

2 88 99

0.0000 0 4 关注作者 收藏

评论(0)


暂无数据

推荐课程

推荐帖子