2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

R語言循環(huán)函數(shù)編寫三境界

 育種數(shù)據(jù)分析 2021-11-18

1. 三境界

R語言寫循環(huán)有三境界:

  • 手動for循環(huán)
  • apply系列
  • purrr泛函式編程

其中,手動for循環(huán)我最常用,apply系列半吊子,purrr函數(shù)越用越趁手,這里介紹一下purrr編寫循環(huán)的方法。

2. 泛函式函數(shù)

「泛函式定義:」

?

函數(shù)的函數(shù)稱為泛函式,map(x,f)中,map是函數(shù),f也是函數(shù),f是map的參數(shù),那么map就是泛函數(shù)。

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

這里,map是函數(shù),meanmap的參數(shù)。

3. 走兩步

「測試數(shù)據(jù):」

> 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

「任務(wù):」

?

計算y1和y2兩列的平均值

?

4. 第一境界:for循環(huán)

for循環(huán),是編程語言中都有的功能,因為for循環(huán)在R語言中速度較慢被各種嫌棄,但是它簡單易用,容易理解,所以我寫函數(shù)時,經(jīng)常使用for循環(huán)鑲嵌for循環(huán),樂此不疲。

「看代碼:」

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

代碼解釋:

  • 1,將結(jié)果賦值給re,所以先定義一個re的列表,為空
  • 2,因為是兩列,所以是1:2
  • 3,分別計算平均數(shù)
  • 4,循環(huán)結(jié)束
  • 5,打印結(jié)果re

5. 第二境界:apply家族

apply是一套函數(shù),有很多相關(guān)的函數(shù),舉幾個applylapply,sapplyvapply,mapply,tapply,rapply,eapply,我曾經(jīng)認(rèn)真的被勸退了好幾次,因為理解得不透測,我認(rèn)為R語言學(xué)到apply家族就是我的職業(yè)生涯的結(jié)束。

?

工作第二年,我開始學(xué)習(xí)apply家族函數(shù),工作第10年,我還在學(xué)習(xí)apply家族函數(shù)。

?

「代碼:」

> apply(dat,2,mean)
y1 y2
0.2194833 10.3295686
  • dat為數(shù)據(jù)
  • 第二個為參數(shù)
    • 1表示按照行
    • 2表示按照列
  • mean為平均數(shù)函數(shù)

6. 第三境界:purrr

學(xué)習(xí)purrr,可以放棄學(xué)習(xí)apply家族了,該有的都有,邏輯更清楚,學(xué)完之后就能用,完全沒有出家的感覺。

?

備注:這里是指從入門到出家的感覺

?

purrr包中的函數(shù)主要是map,有三類:

  • map函數(shù),支持一元函數(shù)
  • map2函數(shù),支持二元函數(shù)
  • pmap函數(shù),支持多元函數(shù)

學(xué)習(xí)R語言念咒語:Fish,F(xiàn)ish,give me Fish

這里,我們用map做一個演示:

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

$y2
[1] 10.32957

用法和apply類似。將其轉(zhuǎn)化為數(shù)據(jù)框:

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

用匿名函數(shù)試試:

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

7. 用purrr演示一個復(fù)雜的例子

「批量建模」

用一個多年多點的數(shù)據(jù),計算每個地點的方差分析,共有五個地點,用一行map函數(shù)全部搞定,是時候展示真正的實力了……

> 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為數(shù)據(jù)
  • split將Location進行分割,成為list的5個元素
  • map調(diào)用匿名函數(shù)進行方差分析
    • aov為方差分析,Yield ~ Cul為模型
  • summary為顯示方差分析結(jié)果

「結(jié)果:」

> 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

結(jié)果可以看到,每個地點都有一個方差分析表,每個元素為地點的方差分析結(jié)果。

8. 啥也別說,雙擊666吧

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多