R语言循环函数编写三境界
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
是函数,mean
是map
的参数。
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是一套函数,有很多相关的函数,举几个apply
,lapply
,sapply
,vapply
,mapply
,tapply
,rapply
,eapply
,我曾经认真的被劝退了好几次,因为理解得不透测,我认为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
为模型
- aov为方差分析,
- 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语言循环函数编写三境界相关推荐
- R语言可视化、编写自定义函数可视化水平排序条形图(horizontal bar plot)、自定义图像布局模仿经济学人杂志可视化效果、右侧添加标签数值图像方框、自定义背景色、水平条形图中间线条等
R语言可视化.编写自定义函数可视化水平排序条形图(horizontal bar plot).自定义图像布局模仿经济学人杂志可视化效果.右侧添加标签数值图像方框.自定义背景色.水平条形图中间线条.网格线 ...
- R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等)、编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据)、应用自定函数
R语言用户自定义函数的语法结构.编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等).编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据).应用自定函数 ...
- R语言系统教程(三):多维数组和矩阵
R语言系统教程(三):多维数组和矩阵 3.1 生成数组或矩阵 3.1.1 将向量定义为数组 3.1.2 用array()函数构造多维数组 3.1.3 用matrix()函数构造矩阵 3.2 数组下标 ...
- R语言 自定义函数之趣味程序--老虎机
****R语言 自定义函数之趣味程序--老虎机**** 自定义函数 自定义规则 自定义格式 案例:老虎机 老虎机符号准备 老虎机结果分类 老虎机得分计算 开始老虎机试玩 获奖感言 自定义函数 R语言作 ...
- R语言mode函数计算众数实战
R语言mode函数计算众数实战 目录 R语言mode函数计算众数实战 #手动编写众数函数 #存在多个众数的情况
- R语言break函数和next函数实战
R语言break函数和next函数实战 目录 R语言break函数和next函数实战 # 基础for循环 #带break的for循环 # 带next的for循环
- r语言 c 函数返回值,R语言入门 输出函数 cat、print、paste等区别理解
一. 简介 cat.print函数都是输出函数 > cat("hello world") hello world >> print("hello wor ...
- R语言--rep函数
R语言--rep函数 基础用法和参数 版权声明:本文为CSDN博主「Kalinda_yu」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明. 原文链接:https:// ...
- R语言基础题及答案(三)——R语言与统计分析第三章课后习题(汤银才)
R语言与统计分析第三章课后习题(汤银才) 题-1 从1到100个自然数中随机不放回地抽取5个数, 并求它们的和. sum(sample(1:100,5)) 15~490任何一个数都有可能 [1] 29 ...
最新文章
- hdu 5367(线段树+区间合并)
- matplotlib.pyplot分区绘图
- java性能调优及问题追踪--Btrace的使用
- Linux下进程通信的八种方法
- C++ 中的三种继承public , protected, private
- 根据企业信息化应用需求来分析工作流平台的选型
- 经常需要在开发中使用Excel COM,为简化使用写了这个类,感觉还是不太方便
- mysql数据库(4): 创建并选择数据库
- STM32之FSMC-SRAM例程
- pdo mysql下载,yum安装mysql5.7 和 pdo_mysql扩展
- 0x02 如何安装【XPS 查看器】?超简单哦!
- 《麦肯锡方法》第9章 头脑风暴-思维导图
- Visual studio 201X中编译器配置
- 论文阅读:FVQA: Fact-based Visual Question Answering
- Docker容器时间与宿主机时间不一致
- android服务无法启动,Android服务无法启动(Android service would't start)
- 案例:三个和尚(升级版)
- 计算机 竞赛 甘肃,甘肃省第三届创新杯计算机应用能力大赛获奖名单
- B05 - 020、HDFS初体验
- 【MySQL】MyCAT三大配置文件详解(MySQL专栏启动)
热门文章
- Apollo 参考线平滑方法Fem Pos Deviation Smoother
- 利用json实现vivo x20手机评论的爬取
- mac电脑抹掉数据要多久_Mac系统如何恢复出厂设置
- windows10下wordcloud模块成功安装
- ubuntu 16.04下载网易云音乐 在处理时有错误发生:netease-cloud-music解决
- Portrait Photography: Ten Styles with One Light 人像摄影:一种风格的十种风格 Lynda课程中文字幕
- body 没有被撑开_为什么父div没有被撑开
- pip install 安装的问题
- Android开发:登录/注册界面的编写
- 微信小程序弹出软键盘