||
R语言写循环有三境界
:
其中,手动for循环我最常用,apply系列半吊子,purrr函数越用越趁手,这里介绍一下purrr编写循环的方法。
「泛函式定义:」
❝函数的函数称为泛函式,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
的参数。
「测试数据:」
> dat = data.frame(y1 = rnorm(10),y2 = rnorm(10)+10) > dat y1 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两列的平均值
❞
for
循环for循环,是编程语言中都有的功能,因为for循环在R语言中速度较慢被各种嫌弃,但是它简单易用,容易理解,所以我写函数时,经常使用for循环镶嵌for循环,乐此不疲。
「看代码:」
re = list() #1 for(i in 1:2){ #2 re[[i]] = mean(dat[,i]) #3 } #4 re #5
代码解释:
1:2
re
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
学习purrr,可以放弃学习apply家族了,该有的都有,逻辑更清楚,学完之后就能用,完全没有出家
的感觉。
❝备注: 这里是指从入门到出家的感觉
❞
purrr包中的函数主要是map,有三类:
学习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 2 y1 y2 <dbl> <dbl> 1 0.219 10.3
用匿名函数试试:
> map_df(dat,~mean(.)) # A tibble: 1 x 2 y1 y2 <dbl> <dbl> 1 0.219 10.3
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)
Yield ~ Cul
为模型「结果:」
> MET %>% split(.$Location) %>% map(.,~aov(Yield ~ Cul,.) %>% summary) $CI Df 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 $FL Df 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 $KN Df 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 $SC Df 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 $TX Df 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
结果可以看到,每个地点都有一个方差分析表,每个元素为地点的方差分析结果。
❝欢迎关注我的公众号:
❞育种数据分析之放飞自我
。主要分享R语言,Python,育种数据分析,生物统计,数量遗传学,混合线性模型,GWAS和GS相关的知识。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-27 20:17
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社