作者简介Introduction

邬书豪,车联网数据挖掘工程师 ,R语言中文社区专栏作者。微信ID:wsh137552775

知乎专栏:https://www.zhihu.com/people/wu-shu-hao-67/activities

往期回顾

kaggle案例:数据科学社区调查报告(附学习视频)

kaggle案例:员工离职预测(附学习视频)

Kaggle案例:美国枪击案(附数据集和代码)

kaggle:金拱门餐厅食物营养性(二)

kaggle:金拱门餐厅食物营养性(一)

R可视化分析美国的肥胖症,嘿!

在R中经常会用到一些循环,对于数据量较小的数据,我们使用for循环之类的显循环也没发现什么弊端,但是针对数据量较大的数据,依旧使用显循环,就会发现R中的显循环效率真低!!!那么,今天我们针对apply家族,去总结和对比向量计算和显循环计算。

# apply

apply(X, MARGIN, FUN, ...)

X:数组、矩阵、数据框

MARGIN:即按行或列计算(1:行,  2:列)

FUN:自定义函数

dat_matrix <- matrix(1:1000000, ncol = 10)  # 构建一个矩阵
head(dat_matrix)          # 查看矩阵的前六行

## for循环对每行求和,并计时
result <- c()      # 构建空向量去存储计算结果

## 对运行计时
system.time(for(i in 1:100000) {
 a <- sum(dat_matrix[i, ])
 result <- append(result, a)
})
head(result)  # 展示前六个计算结果

## apply函数进行向量化计算,并计时
system.time(apply(dat_matrix, 1, sum))  
head(apply(dat_matrix, 1, sum))

通过上方两个时间的对比,显而易见。使用for循环对我们的矩阵进行逐行求和使用的时间大约是apply向量化计算的80倍左右,可以说是纯粹浪费时间,并且还不如apply的代码简洁易懂。下面举例说明一下如何使用apply函数对数据框的某部分进行标准化操作。

## 对鸢尾花数据框的前三列进行标准化处理
head(iris)
iris[1:3] <- apply(iris[1:3], 2, scale)
head(iris)

在这里,大家需要注意的是:如果既需要处理后的数据,有需要未处理的部分数据,那么对哪一部分进行处理,就要把处理后的数据赋值到原数据的那一部分,否则还得重新合并数据,造成不必要的麻烦。


## lapply

lapply(X, FUN, ...)

X:向量、列表、数组、矩阵、数据框

FUN:自定义函数

## 计算向量中每个元素的长度
dat_vec <- c('tian', 'shan', 'zhienng')
lapply(dat_vec, nchar)

## 对列表的每个元素进行求和
dat_list <- list(a = 1:5, b = 2:6)
lapply(dat_list, sum)

## 对矩阵的每个值进行求和
dat_matrix <- matrix(1:4, 2)
lapply(dat_matrix, sum)

## 对数据框的每列进行求和
dat_df <- as.data.frame(dat_matrix)
lapply(dat_df, sum)
as.data.frame(lapply(dat_df, sum))

从上面几个例子可以看出,lapply返回的均是list,如果我们需要其他类型的数据,需要进行对应的函数转换。


## sapply

sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)

X:向量、列表、数组、矩阵、数据框

FUN:自定义函数

simplify:自定义返回类型(矩阵、列表和数组)

USE.NAME:是否返回名称

## 计算向量中每个元素的长度
sapply(dat_vec, nchar)
sapply(dat_vec, nchar, USE.NAMES = F)

sapply(dat_list, scale) # 标准化列表的元素
sapply(dat_matrix, sum) # 对矩阵的每个值进行求和
sapply(dat_df, sum)     # 对数据框的每列进行求和

# 对数据框的某一列标准化
head(sapply(iris[4], scale, simplify = T))
class(sapply(iris[4], scale, simplify = T))
class(sapply(iris[4], scale, simplify = F))
class(sapply(iris[4], scale, simplify = "array"))
head(sapply(iris[4], scale, simplify = "array"))

从上面可以看出,sapply最大的不同就是返回的数据类型不同,其次就是多了两个参数。

上面标准化某列时,如果simplify的取值是T,则返回矩阵;如果是F,则返回列表;如果是“array”,则返回数组。

参数USE.NAME只对与X为向量时起作用,控制是否返回名称。


## vapply

vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)

X:向量、列表、数组、数据框

FUN:自定义函数

FUN.VALUE:设置行索引

USE.NAMES:是否返回名称

## 计算向量中字符串的长度
vapply(dat_vec, nchar, FUN.VALUE = c('a' = 0), USE.NAMES = F)
class(vapply(dat_vec, nchar, FUN.VALUE = c('a' = 0)))

## 对列进行标准化
vapply(dat_list, scale, FUN.VALUE = c('a'=0,'b'=0,'c'=0,'d'=0,'e'=0))
class(vapply(dat_list, scale, FUN.VALUE = c('a'=0,'b'=0,'c'=0,'d'=0,'e'=0)))

## 对数据框进行标准化
vapply(as.data.frame(dat_matrix), scale, FUN.VALUE = c('a'=0, 'b'=0))

用vapply函数与sapply函数的主要区别就是可以控制行名。当然,我们可以自己利用rownames函数另外设置行名。

## 将x中的数值依次重复两次
mapply(rep, x = 1:4, each = 2)

## 计算字符串的长度,然后与第三个参数相乘
mapply(function(x, y) {nchar(x)*y},
      c('wu', 'shu', 'hao'),
      c(1:3))


## mapply

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)

FUN:自定义函数

...:FUN的参数

MoreAges:函数的其他参数列表

SIMPLIFY:自定义返回类型(矩阵、列表和数组)

USE.NAMES:是否返回名称


## tapply

tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

X:向量

INDEX: 通常是种类

FUN: 自定义函数

…:FUN的参数

simplify : 自定义返回类型(矩阵、列表和数组)

dat_df <- data.frame(x1 = 1:10, x2 = 2:11, type = rep(c('a', 'b')))
tapply(dat_df$x1, dat_df$type, mean) # 统计不同type的x1的均值

## 构建数据框---成绩统计
dat_df2 <- data.frame(class = sample(1:3, 100, replace = T),
                     gender = sample(c('f', 'm'), 100, replace = T),
                     score = sample(60:95, 100, replace = T))
head(dat_df2)
# 统计不同班级、不同性别的学生的平均分
tapply(dat_df2$score, INDEX = list(dat_df2$class, dat_df2$gender), mean)

tapply有一个很特殊的作用,就是分组统计,相当于我们dplyr包里面的group_by。

关于apply家族的讲解就到这里了,总而言之呢,他们都不算完美,相对于孰优孰劣来说,不如是优劣互补!还有几个apply家族的函数,但是几乎用不到他们,所以我就不浪费大家的时间去讲解不常用的函数了。

 往期精彩内容整理合集 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)

相关课程推荐

Kaggle十大案例精讲课程(连载中)

☟☟☟ 戳阅读原文,即刻加入课程。

apply家活跃成员小聚会相关推荐

  1. 【项目源码】智慧班牌源码 家校互联小程序源码 智慧校园云平台

    智慧校园平台源码 智慧班牌源码 人脸识别技术 电子班牌源码 家校互联小程序源码 源码开发环境:Java+springboot+vue+element-ui+mysql 智慧校园系统定位于中小学教育学校 ...

  2. 智慧校园平台源码 智慧班牌源码 人脸识别技术 电子班牌源码 家校互联小程序源码

    智慧校园平台源码 智慧班牌源码 人脸识别技术 电子班牌源码 家校互联小程序源码 源码开发环境:Java+springboot+vue+element-ui+mysql 智慧校园系统定位于中小学教育学校 ...

  3. 极客头条11月份活跃成员奖励名单(20151209)

    铛铛铛!极客头条11月份奖励名单来了! 在此感谢图灵教育.人邮异步社区.华章图书.博文视点出版社对极客头条的大力支持! 本次评选仍然依据贡献数.获赞数.贡献来源多样性等维度评选.这里,先介绍下我们评选 ...

  4. 计算机毕业设计Python+uniapp家校通小程序(小程序+源码+LW)

    计算机毕业设计Python+uniapp家校通小程序(小程序+源码+LW) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行 环境配置: Pychram社区版+ python3 ...

  5. 国内首个共享智能技术联盟成立,亮相上海“外滩大会”,首批共有27家初创成员加入

    9月24日,国内首个共享智能技术联盟成立发布会在"外滩大会"召开.首批共有27家初创成员共同加入,包括众安保险.隔镜科技.中国科学院信息工程研究所等在内的一众金融机构.科技公司和科 ...

  6. 海尔智家体验店小程序助力门店数字化转型

    1. 背景介绍 2. 能力介绍 「 触点数字化 」 「 交互数字化 」 「 交易数字化 」 「 用户数字化 」 3. 工具化列表 4. 运营数据成果展示 5. 团队介绍 「三翼鸟数字化技术平台-交易交 ...

  7. 聚会活跃气氛小程序-喝酒神器

    这是一款带特效的喝酒神器小游戏微信小程序源码多功能喝酒小程序源码,而且自带特效,音效炫酷的喝酒神器助兴小程序,活跃气氛首选.并且不需要服务器就能运营 内含的功能都是酒桌上很火的游戏 比如大家常见的以下 ...

  8. Discuz 群组 新加入 活跃成员 成员列表 会员数量问题!

    最近在搞一个小网站,用到了群组功能,这是前提,修改过程中发现几个小问题. 1新加入 活跃成员数量为9个,这样在默认样式下就会少一个不太美观. 2成员列表为50个,这样在默认样式下就会少五个个不太美观. ...

  9. AI 科技评论和学术青年们的 GAIR 小聚会,面基就要freestyle|CCF-GAIR 2017

    今天是中国计算机学会(CCF)主办,雷锋网与香港中文大学(深圳)承办的第二届CCF-GAIR人工智能与机器人峰会的首日,毫无疑问也是人工智能众「牛」云集的一天.而同样是在 7 月 7 日,雷锋网(公众 ...

  10. 极客头条8月份活跃成员奖励名单(20150909)

    各位社区成员,还记得<极客头条携手四大技术出版社,为活跃贡献者提供图书奖励>吗?它主要表述了一件事情: 极客头条与图灵教育.人民邮电出版社.华章图书.博文视点达成合作,它们将为极客头条提供 ...

最新文章

  1. Mysql——case函数
  2. scala 操作hdfs
  3. 构造方法和方法的重载。
  4. 大批量插入数据如何优化
  5. linux查询字段排序,Linux 操作命令 sort
  6. Android 接入baceBook
  7. 全国计算机一级试题重难点,全国计算机等级考试一级MS选择题(重难点)部分.doc...
  8. 使用 CSS3 实现 3D 图片滑块效果
  9. integer判断是否为null_面试常考题JavaScript用七种方式教你判断一个变量是否为数组类型...
  10. exe dll html病毒专杀,清除更改主页的mshtmldy.dll、mshtmldx.dll病毒
  11. 【微信小程序】微信Web开发者工具的部分界面功能
  12. sql语句中----删除表数据的三兄弟
  13. STEP2——《数据分析:企业的贤内助》重点摘要笔记(四)——数据清洗
  14. 淮安万达机器人_淮安万博机器人 万达上班时间【输入网址YB7888.vip】angmi_PP视频搜索-PP视频-原PPTV聚力视频...
  15. dede模板加入php无法生成栏目,织梦后台更新后栏目无法生成,怎么办?
  16. 几何图形及计算公式查询
  17. Unity3d 实现节奏空间(Beat Saber)模型切割功能项目工程源码。
  18. 淘宝聚划算怎么做?大神导航,一个神奇的网站从此开启大神之路
  19. Android网络通信(HttpURLConnection)和 数据传输格式(JSON)
  20. 摄影技巧分享之:如何拍好全家福

热门文章

  1. Uber的微服务架构实践
  2. Linux服务器时间同步那些事
  3. html 二级菜单延迟消失,让HTML5通知在延迟后消失? - Let HTML5 Notification disappear after a delay? - 开发者知识库...
  4. lamp mysql5.0_LAMP-MYSQL安装全步骤
  5. ES6学习笔记(对象)
  6. 数据是如何从浏览器传输到服务器
  7. Windows下PyMC安装
  8. 不可或缺的PrepareImageRegions函数
  9. php值传递和引用传递
  10. JSON文件导入Unity3d中是空的的问题