请选择 进入手机版 | 继续访问电脑版
楼主: maozhiqiang
70697 16

[程序分享] R语言中apply,sapply,tapply函数的区别与应用 [推广有奖]

  • 0关注
  • 5粉丝

本科生

41%

还不是VIP/贵宾

-

威望
0
论坛币
4832 个
通用积分
2.0004
学术水平
8 点
热心指数
9 点
信用等级
7 点
经验
5557 点
帖子
51
精华
0
在线时间
76 小时
注册时间
2010-5-19
最后登录
2021-12-28

maozhiqiang 发表于 2015-12-10 22:27:20 |显示全部楼层

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
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)}})$shop_id[1] 52 $saled[1] 656.1154 $takeout_cost[1] 3.673077 $delivery_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(s$score,s$class,mean) #计算每个班平均成绩

    1    2

92.5 93.5

> tapply(s$score,s$gender,mean) #计算男女生的平均成绩

F  M

89 97

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

    F  M

1 90 95

2 88 99

转自:http://f.dataguru.cn/thread-575047-1-1.html

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:apply函数 apply appl App SAP Matrix

wangfs111222 发表于 2015-12-10 23:23:32 |显示全部楼层

使用道具

cheetahfly 在职认证  发表于 2015-12-11 08:28:24 |显示全部楼层
这样的好贴要赞

使用道具

luorongjin 发表于 2016-5-20 10:30:55 |显示全部楼层
好顶赞啊,lz总结的很好,非常感谢

使用道具

180084231 发表于 2016-6-10 10:39:56 |显示全部楼层
感谢回答

使用道具

Akybat 发表于 2016-6-20 11:56:09 |显示全部楼层
谢谢分享

使用道具

Levy_ww 发表于 2016-7-24 12:26:04 |显示全部楼层
感谢楼主分享

使用道具

lonestone 在职认证  发表于 2016-7-25 06:36:34 来自手机 |显示全部楼层
maozhiqiang 发表于 2015-12-10 22:27
1、apply函数
对一个Matrix或者Array进行某个维度的运算。其格式是:
apply(数据,维度Index,运算函数,函数 ...
谢谢楼主

使用道具

soho有我 发表于 2016-9-5 11:16:40 |显示全部楼层
好贴,谢谢楼主啊

使用道具

Tia1992 发表于 2016-10-22 11:52:59 |显示全部楼层
感谢楼主!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2022-8-9 12:36