1. 三境界

R语言写循环有三境界:

  • 手动for循环
  • apply系列
  • purrr泛函式编程

其中,手动for循环我最常用,apply系列半吊子,purrr函数越用越趁手,这里介绍一下purrr编写循环的方法。

2. 泛函式函数

泛函式定义:

函数的函数称为泛函式,map(x,f)中,map是函数,f也是函数,f是map的参数,那么map就是泛函数。

dat = data.frame(y1 = rnorm(10),y2 = rnorm(10)+10)
dat
map(dat,mean)

这里,map是函数,meanmap的参数。

3. 走两步

测试数据:

> dat = data.frame(y1 = rnorm(10),y2 = rnorm(10)+10)
> daty1        y2
1  -0.4535438 10.383757
2   0.7821634 11.186901
3   2.0556094  9.382660
4   1.0848204  8.713453
5  -1.4152480 12.927827
6  -0.2379161  9.938319
7  -1.3191011  9.281052
8   0.4194484 10.323932
9   1.4207450 10.142454
10 -0.1421450 11.015331

任务:

计算y1和y2两列的平均值

4. 第一境界:for循环

for循环,是编程语言中都有的功能,因为for循环在R语言中速度较慢被各种嫌弃,但是它简单易用,容易理解,所以我写函数时,经常使用for循环镶嵌for循环,乐此不疲。

看代码:

re = list() #1
for(i in 1:2){ #2re[[i]] = mean(dat[,i]) #3
} #4
re #5

代码解释:

  • 1,将结果赋值给re,所以先定义一个re的列表,为空
  • 2,因为是两列,所以是1:2
  • 3,分别计算平均数
  • 4,循环结束
  • 5,打印结果re

5. 第二境界:apply家族

apply是一套函数,有很多相关的函数,举几个applylapplysapplyvapplymapplytapplyrapplyeapply,我曾经认真的被劝退了好几次,因为理解得不透测,我认为R语言学到apply家族就是我的职业生涯的结束。

工作第二年,我开始学习apply家族函数,工作第10年,我还在学习apply家族函数。

代码:

> apply(dat,2,mean)y1         y2 0.2194833 10.3295686
  • dat为数据
  • 第二个为参数
    • 1表示按照行
    • 2表示按照列
  • mean为平均数函数

6. 第三境界:purrr

学习purrr,可以放弃学习apply家族了,该有的都有,逻辑更清楚,学完之后就能用,完全没有出家的感觉。

备注: 这里是指从入门到出家的感觉

purrr包中的函数主要是map,有三类:

  • map函数,支持一元函数
  • map2函数,支持二元函数
  • pmap函数,支持多元函数

学习R语言念咒语:Fish,Fish,give me Fish


这里,我们用map做一个演示:

> library(purrr)
> map(dat,mean)
$y1
[1] 0.2194833$y2
[1] 10.32957

用法和apply类似。将其转化为数据框:

> map_df(dat,mean)
# A tibble: 1 x 2y1    y2<dbl> <dbl>
1 0.219  10.3

用匿名函数试试:

> map_df(dat,~mean(.))
# A tibble: 1 x 2y1    y2<dbl> <dbl>
1 0.219  10.3

7. 用purrr演示一个复杂的例子

批量建模

用一个多年多点的数据,计算每个地点的方差分析,共有五个地点,用一行map函数全部搞定,是时候展示真正的实力了……

> library(learnasreml)
> data(MET)
> str(MET)
'data.frame': 400 obs. of  5 variables:$ Year    : Factor w/ 2 levels "2009","2010": 1 1 1 1 1 1 1 1 1 1 ...$ Location: Factor w/ 5 levels "CI","FL","KN",..: 3 3 3 3 3 3 3 3 3 3 ...$ Rep     : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...$ Cul     : Factor w/ 10 levels "CalhounGray",..: 3 1 9 2 5 4 7 10 6 8 ...$ Yield   : num  56.2 74.2 32.6 74.2 64.8 ...

代码:

library(tidyverse)
MET %>% split(.$Location) %>% map(.,~aov(Yield ~ Cul,.) %>% summary)
  • MET为数据
  • split将Location进行分割,成为list的5个元素
  • map调用匿名函数进行方差分析
    • aov为方差分析,Yield ~ Cul为模型
  • summary为显示方差分析结果

结果:

> MET %>% split(.$Location) %>% map(.,~aov(Yield ~ Cul,.) %>% summary)
$CIDf Sum Sq Mean Sq F value  Pr(>F)
Cul          9   8696   966.2   3.193 0.00277 **
Residuals   69  20879   302.6
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
1 observation deleted due to missingness$FLDf Sum Sq Mean Sq F value Pr(>F)
Cul          9  10151  1127.9   1.565  0.143
Residuals   69  49723   720.6
1 observation deleted due to missingness$KNDf Sum Sq Mean Sq F value   Pr(>F)
Cul          9   8236   915.1   4.038 0.000338 ***
Residuals   70  15863   226.6
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1$SCDf Sum Sq Mean Sq F value   Pr(>F)
Cul          9  24478  2719.8     5.6 8.42e-06 ***
Residuals   70  33996   485.7
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1$TXDf Sum Sq Mean Sq F value Pr(>F)
Cul          9   5784   642.6   1.326   0.24
Residuals   69  33429   484.5
1 observation deleted due to missingness

结果可以看到,每个地点都有一个方差分析表,每个元素为地点的方差分析结果。

8. 啥也别说,双击666吧

欢迎关注我的公众号:育种数据分析之放飞自我。主要分享R语言,Python,育种数据分析,生物统计,数量遗传学,混合线性模型,GWAS和GS相关的知识。

R语言循环函数编写三境界相关推荐

  1. R语言可视化、编写自定义函数可视化水平排序条形图(horizontal bar plot)、自定义图像布局模仿经济学人杂志可视化效果、右侧添加标签数值图像方框、自定义背景色、水平条形图中间线条等

    R语言可视化.编写自定义函数可视化水平排序条形图(horizontal bar plot).自定义图像布局模仿经济学人杂志可视化效果.右侧添加标签数值图像方框.自定义背景色.水平条形图中间线条.网格线 ...

  2. R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等)、编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据)、应用自定函数

    R语言用户自定义函数的语法结构.编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等).编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据).应用自定函数 ...

  3. R语言系统教程(三):多维数组和矩阵

    R语言系统教程(三):多维数组和矩阵 3.1 生成数组或矩阵 3.1.1 将向量定义为数组 3.1.2 用array()函数构造多维数组 3.1.3 用matrix()函数构造矩阵 3.2 数组下标 ...

  4. R语言 自定义函数之趣味程序--老虎机

    ****R语言 自定义函数之趣味程序--老虎机**** 自定义函数 自定义规则 自定义格式 案例:老虎机 老虎机符号准备 老虎机结果分类 老虎机得分计算 开始老虎机试玩 获奖感言 自定义函数 R语言作 ...

  5. R语言mode函数计算众数实战

    R语言mode函数计算众数实战 目录 R语言mode函数计算众数实战 #手动编写众数函数 #存在多个众数的情况

  6. R语言break函数和next函数实战

    R语言break函数和next函数实战 目录 R语言break函数和next函数实战 # 基础for循环 #带break的for循环 # 带next的for循环

  7. r语言 c 函数返回值,R语言入门 输出函数 cat、print、paste等区别理解

    一. 简介 cat.print函数都是输出函数 > cat("hello world") hello world >> print("hello wor ...

  8. R语言--rep函数

    R语言--rep函数 基础用法和参数 版权声明:本文为CSDN博主「Kalinda_yu」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明. 原文链接:https:// ...

  9. R语言基础题及答案(三)——R语言与统计分析第三章课后习题(汤银才)

    R语言与统计分析第三章课后习题(汤银才) 题-1 从1到100个自然数中随机不放回地抽取5个数, 并求它们的和. sum(sample(1:100,5)) 15~490任何一个数都有可能 [1] 29 ...

最新文章

  1. hdu 5367(线段树+区间合并)
  2. matplotlib.pyplot分区绘图
  3. java性能调优及问题追踪--Btrace的使用
  4. Linux下进程通信的八种方法
  5. C++ 中的三种继承public , protected, private
  6. 根据企业信息化应用需求来分析工作流平台的选型
  7. 经常需要在开发中使用Excel COM,为简化使用写了这个类,感觉还是不太方便
  8. mysql数据库(4): 创建并选择数据库
  9. STM32之FSMC-SRAM例程
  10. pdo mysql下载,yum安装mysql5.7 和 pdo_mysql扩展
  11. 0x02 如何安装【XPS 查看器】?超简单哦!
  12. 《麦肯锡方法》第9章 头脑风暴-思维导图
  13. Visual studio 201X中编译器配置
  14. 论文阅读:FVQA: Fact-based Visual Question Answering
  15. Docker容器时间与宿主机时间不一致
  16. android服务无法启动,Android服务无法启动(Android service would't start)
  17. 案例:三个和尚(升级版)
  18. 计算机 竞赛 甘肃,甘肃省第三届创新杯计算机应用能力大赛获奖名单
  19. B05 - 020、HDFS初体验
  20. 【MySQL】MyCAT三大配置文件详解(MySQL专栏启动)

热门文章

  1. Apollo 参考线平滑方法Fem Pos Deviation Smoother
  2. 利用json实现vivo x20手机评论的爬取
  3. mac电脑抹掉数据要多久_Mac系统如何恢复出厂设置
  4. windows10下wordcloud模块成功安装
  5. ubuntu 16.04下载网易云音乐 在处理时有错误发生:netease-cloud-music解决
  6. Portrait Photography: Ten Styles with One Light 人像摄影:一种风格的十种风格 Lynda课程中文字幕
  7. body 没有被撑开_为什么父div没有被撑开
  8. pip install 安装的问题
  9. Android开发:登录/注册界面的编写
  10. 微信小程序弹出软键盘