【r<-包】R-數(shù)據(jù)操作(四):使用dplyr操作數(shù)據(jù)框

使用dplyr操作數(shù)據(jù)框

關(guān)于dplyr的基本操作我已經(jīng)寫過很多筆記了,不再贅述,想學(xué)習(xí)的讀者請(qǐng)參閱下面幾篇文章,這部分我只挑沒接觸過的學(xué)習(xí)下。

data.table類似,dplyr也提供了do()函數(shù)來對(duì)每組數(shù)據(jù)進(jìn)行任意操作。

例如將diamondscut分組,每組都按log(price) ~ carat擬合一個(gè)線性模型。和data.table不同的是,我們需要為操作指定一個(gè)名稱,以便將結(jié)果存儲(chǔ)在列中。而且do()表達(dá)式不能直接在分組數(shù)據(jù)的語義下計(jì)算 ,我們需要使用.來表示數(shù)據(jù)。

data("diamonds", package = "ggplot2")
models = diamonds %>% 
    group_by(cut) %>% 
    do(lmod = lm(log(price) ~ carat, data = .))
models
#> Source: local data frame [5 x 2]
#> Groups: <by row>
#> 
#> # A tibble: 5 x 2
#>   cut       lmod    
#> * <ord>     <list>  
#> 1 Fair      <S3: lm>
#> 2 Good      <S3: lm>
#> 3 Very Good <S3: lm>
#> 4 Premium   <S3: lm>
#> 5 Ideal     <S3: lm>

注意結(jié)果創(chuàng)建了一個(gè)新列,該列不是典型的原子向量,每個(gè)元素都是模型的結(jié)果,包含線性回歸對(duì)象的列表。我們可以通過索引來提取模型結(jié)果:

models$lmod[[1]]
#> 
#> Call:
#> lm(formula = log(price) ~ carat, data = .)
#> 
#> Coefficients:
#> (Intercept)        carat  
#>        6.78         1.25

在需要完成高度定制的操作時(shí),do()的優(yōu)勢(shì)非常明顯。下面舉例。

假如我們需要分析toy_tests數(shù)據(jù),要對(duì)每種產(chǎn)品的質(zhì)量和耐久性進(jìn)行匯總。如果只需要樣本數(shù)最多的3個(gè)測(cè)試記錄,并且每個(gè)產(chǎn)品的質(zhì)量和耐久性是經(jīng)樣本數(shù)加權(quán)的平均數(shù),下面是做法。

toy_tests %>% 
    group_by(id) %>% 
    arrange(desc(sample)) %>% 
    do(head(., 3)) %>% 
    summarise(
        quality = sum(quality * sample) / sum(sample),
        durability = sum(durability * sample) / sum(sample)
    )
#> # A tibble: 2 x 3
#>   id    quality durability
#>   <chr>   <dbl>      <dbl>
#> 1 T01      9.32       9.38
#> 2 T02      9.04       8.34

為了查看中間結(jié)果,可以運(yùn)行do()之前的代碼:

toy_tests %>% 
    group_by(id) %>% 
    arrange(desc(sample))
#> # A tibble: 8 x 6
#> # Groups:   id [2]
#>   id        date sample quality durability ym    
#>   <chr>    <int>  <int>   <int>      <int> <chr> 
#> 1 T01   20160405    180       9         10 201604
#> 2 T01   20160302    150      10          9 201603
#> 3 T01   20160502    140       9          9 201605
#> 4 T01   20160201    100       9          9 201602
#> 5 T02   20160403     90       9          8 201604
#> 6 T02   20160502     85      10          9 201605
#> 7 T02   20160303     75       8          8 201603
#> 8 T02   20160201     70       7          9 201602
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容