99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
2018-10-28 閱讀量: 922
R擴(kuò)展包dplyr筆記分享(2)

2 分組動作 group_by()

以上5個(gè)動詞函數(shù)已經(jīng)很方便了, 但是當(dāng)它們跟分組操作這個(gè)概念結(jié)合起來時(shí), 那才叫真正的強(qiáng)大! 當(dāng)對數(shù)據(jù)集通過 group_by() 添加了分組信息后,mutate(), arrange() 和 summarise() 函數(shù)會自動對這些 tbl 類數(shù)據(jù)執(zhí)行分組操作 (R語言泛型函數(shù)的優(yōu)勢).

例如: 對飛機(jī)航班數(shù)據(jù)按飛機(jī)編號 (TailNum) 進(jìn)行分組, 計(jì)算該飛機(jī)航班的次數(shù) (count = n()), 平均飛行距離 (dist = mean(Distance, na.rm = TRUE)) 和 延時(shí) (delay = mean(ArrDelay, na.rm = TRUE))

planes <- group_by(hflights_df, TailNum)delay <- summarise(planes,? ?count = n(),? ?dist = mean(Distance, na.rm = TRUE),? ?delay = mean(ArrDelay, na.rm = TRUE))delay <- filter(delay, count > 20, dist < 2000)

用 ggplot2 包作個(gè)圖觀察一下, 發(fā)現(xiàn)飛機(jī)延時(shí)不延時(shí)跟飛行距離沒太大相關(guān)性:

ggplot(delay, aes(dist, delay)) +? ?geom_point(aes(size = count), alpha = 1/2) +? ?geom_smooth() +? ?scale_size_area()

(圖就不上了, 右鍵復(fù)制來的鏈接太兇殘了, 看著像是現(xiàn)算的)

更多例子見 vignette("introduction", package = "dplyr")

另: 一些匯總時(shí)的小函數(shù)

  • n(): 計(jì)算個(gè)數(shù)
  • n_distinct(): 計(jì)算 x 中唯一值的個(gè)數(shù). (原文為 count_distinct(x), 測試無用)
  • first(x), last(x) 和 nth(x, n): 返回對應(yīng)秩的值, 類似于自帶函數(shù) x[1], x[length(x)], 和 x[n]

注意: 分組計(jì)算得到的統(tǒng)計(jì)量要清楚樣本已經(jīng)發(fā)生了變化, 此時(shí)的中位數(shù)是不可靠的

3 連接符 %.%

包里還新引進(jìn)了一個(gè)操作符, 使用時(shí)把數(shù)據(jù)名作為開頭, 然后依次對此數(shù)據(jù)進(jìn)行多步操作.

比如:

Batting %.%? ? group_by(playerID) %.%? ? summarise(total = sum(G)) %.%? ? arrange(desc(total)) %.%? ? head(5)

這樣可以按進(jìn)行數(shù)據(jù)處理時(shí)的思路寫代碼, 一步步深入, 既易寫又易讀, 接近于從左到右的自然語言順序, 對比一下用R自帶函數(shù)實(shí)現(xiàn)的:

head(arrange(summarise(group_by(Batting, playerID), total = sum(G)) , desc(total)), 5)

或者像這篇文章所用的方法:

totals <- aggregate(. ~ playerID, data=Batting[,c("playerID","R")], sum)ranks <- sort.list(-totals$R)totals[ranks[1:5],]

文章里還表示: 用他的 MacBook Air 跑 %.% 那段代碼用了 0.036 秒, 跑上面這段代碼則用了 0.266 秒, 運(yùn)算速度提升了近7倍. (當(dāng)然這只是一例, 還有其它更大的數(shù)字.)

更多請 ?"%.%", 至于這個(gè)新鮮的概念會不會和 ggplot2 里的 + 連接號一樣, 發(fā)揮出種種奇妙的功能呢? 還是在實(shí)際使用中多體驗(yàn)感受吧.

感想

可以看到, 用 dplyr 所含函數(shù)實(shí)現(xiàn)的代碼都要簡潔易讀得多, 說到底, R語言只是一個(gè)工具, 作為工具, 就是要拿來用的, 越稱手越便利越簡潔越好, 可是, 正如 Hadley Wickham 在2013年的訪談中提到的那樣:

如果你用了8小時(shí)進(jìn)行數(shù)據(jù)清理和數(shù)據(jù)整理,而只用了2小時(shí)進(jìn)行建模,那么很明顯,你希望了解如何將數(shù)據(jù)清理和整理的時(shí)間盡可能縮短。

反思之下, 本人也是將大把的時(shí)間花在了對數(shù)據(jù)的反復(fù)調(diào)整上, 或許是手生, 當(dāng)然R語言在這方面也確實(shí)有一定不足, 大神又說了:

數(shù)據(jù)分析有兩個(gè)瓶頸,一是我們的目標(biāo)是什么,二是我們?nèi)绾斡糜?jì)算機(jī)去實(shí)現(xiàn)。我現(xiàn)有的很多作品,如 ggplot2,plyr 和 reshape2,更關(guān)注的是如何更簡單地表達(dá)你的目標(biāo),而不是如何讓計(jì)算機(jī)算得更快。

這種內(nèi)在的理念正是要將工具工具化, 把無謂的時(shí)間減少, 讓精力用在真正需要考慮的地方. 正如 Vim 一樣, 在投入一定的學(xué)習(xí)成本后, 繼續(xù)用繼續(xù)學(xué), 不知不覺地就能心手如一, 想做什么, 就已經(jīng)按下去了, 從而更多地思考要編輯什么, 而不必糾結(jié)于光標(biāo)移動選擇等細(xì)節(jié). 這其中的巧妙之處在于: 實(shí)現(xiàn)過程要以人腦的思維運(yùn)作方式為標(biāo)準(zhǔn), 讓工具來適應(yīng)人, 以實(shí)現(xiàn)目的為導(dǎo)向, ggplot2 的圖形圖層語法也是如此. 不管是軟件也好, 編程語言也好, 高效的方法都是相通的, 這也正是許多人努力的方向, 另外平素語出驚人的王垠最近也表達(dá)了類似觀點(diǎn).

順便肖凱老師在網(wǎng)易云課堂新開的R語言初級教程里提到了十大必學(xué)R包的說法, 并把 plyr 列為之一, 有趣的是居然還有人在問答平臺上求詳情, 好奇之下放狗一搜, 原來出處在此 (脫水版), 其中 ggplot2 和 reshape2 是平時(shí)都有在用的, 還有實(shí)用的 knitr 和 Slidify , 其它就沒什么發(fā)言權(quán)了.

深入學(xué)習(xí)

暫時(shí)沒有太多的相關(guān)資料, 如欲進(jìn)一步學(xué)習(xí), 可參閱:

  • dplyr 包自帶的60頁詳細(xì)文檔
  • 其余幾個(gè)vignettes (網(wǎng)頁) 或 vignette(package = "dplyr") , 包含了數(shù)據(jù)庫相關(guān), 混合編程, 運(yùn)算性能比較, 以及新的 window-functions 等內(nèi)容.
    簡單看了下vignette("window-functions", package = "dplyr"), 提供了一系列函數(shù), 擴(kuò)展了原來只能返回一個(gè)數(shù)值的聚焦類函數(shù)(如sum(), mean())至返回等長度的值, 變成 cumsum()和 cummean(), 以及 n(), lead() 和 lag()等便捷功能.
  • plyr 包的相關(guān)文檔: 主頁
  • 還有 data.table 包也是很強(qiáng)大的哦, 空下來可以學(xué)一學(xué)
0.0000
3
關(guān)注作者
收藏
評論(0)

發(fā)表評論

暫無數(shù)據(jù)
推薦帖子