節(jié)省tidyverse中的管道%>%

分享{dplyr}中一些鮮為人知的功能夕膀,喜歡可以關注我的公眾號R語言數(shù)據(jù)分析指南

library(tidyverse)
data("penguins", package = "palmerpenguins")
penguins <- na.omit(penguins)

1.rename()里面select()

penguins %>% 
  select(species, island) %>% 
  rename(penguin_species = species)

penguins %>% 
  select(penguin_species = species,
         island)

2.rename()里面count()

penguins %>% count(species) %>% 
  rename(total = n)

penguins %>% 
  count(species, name = "total")

還可以使用與select()上面的示例來計數(shù)并重新命名

penguins %>% 
  count(species) %>% 
  rename(total = n,penguin_species = species)

penguins %>% 
  count(penguin_species = species, name = "total")

請注意,傳遞給name參數(shù)的新名稱必須用引號引起來烙荷,但選定列的新名稱不必用引號引起來

3.mutate()里面count()

這很簡單-您只需在mutate()內(nèi)部執(zhí)行以下操作即可count()

penguins %>% 
  mutate(long_beak = bill_length_mm > 50) %>% 
  count(long_beak)

penguins %>% 
  count(long_beak = bill_length_mm > 50)

當然,當指定多個變量以下列方式計數(shù)時檬寂,此方法也適用

penguins %>% 
  mutate(long_beak = bill_length_mm > 50,
         is_adelie = species == "Adelie") %>% 
  count(is_adelie, long_beak)

penguins %>% 
  count(long_beak = bill_length_mm > 50,
        is_adelie = species == "Adelie")

4. transmute()+select()

penguins %>% 
mutate(body_mass_kg = body_mass_g/1000) %>% 
select(body_mass_kg)

penguins %>% 
transmute(body_mass_kg = body_mass_g/1000)

transmute()過去我很少使用過奢讨,因為我認為它只能返回經(jīng)過修改的列,這將是非常有限的(例如焰薄,在上面的示例中拿诸,以公斤為單位的企鵝體重有什么好處?)

但是實際上塞茅,您只可以命名要包括的列亩码,transmute()就像select()繼承未修改的列一樣。當然野瘦,您可以在執(zhí)行操作時對其“重命名

penguins %>% 
  mutate(body_mass_kg = body_mass_g/1000) %>% 
  select(species, island, body_mass_kg) %>% 
  rename(penguin_species = species)

penguins %>% 
  transmute(penguin_species = species,
            island,
            body_mass_kg = body_mass_g/1000)

5.ungroup()里面summarize()

penguins %>% 
  group_by(island, species) %>% 
  summarize(mean_mass = mean(body_mass_g, na.rm = TRUE)) %>% 
  ungroup()

因為summarize()僅按defaut刪除最后一個分組變量描沟,這意味著如果ungroup()不調(diào)用island,輸出仍按變量分組:

penguins %>% 
  group_by(island, species) %>% 
  summarize(mean_mass = mean(body_mass_g, na.rm = TRUE)) %>% 
  group_vars()
penguins %>% 
  group_by(island, species) %>% 
  summarize(mean_mass = mean(body_mass_g, na.rm = TRUE)) %>% 
  ungroup() %>% 
  group_vars()

也可以簡單地設置.groups參數(shù)內(nèi)summarize()鞭光,為'drop'達到相同的:

penguins %>% 
  group_by(island, species) %>% 
  summarize(mean_mass = mean(body_mass_g, na.rm = TRUE), .groups = 'drop')
  # A tibble: 5 x 3
    island    species   mean_mass
    <fct>     <fct>         <dbl>
  1 Biscoe    Adelie        3710.
  2 Biscoe    Gentoo        5092.
  3 Dream     Adelie        3701.
  4 Dream     Chinstrap     3733.
  5 Torgersen Adelie        3709.

6. arrange()+其他功能slice()

如果您想獲取按列排序的前n行吏廉,則可以使用top_n(),它提供了一種更簡單的方式 slice()+arrange():


penguins %>% 
  arrange(desc(body_mass_g)) %>% 
  slice(1:5)

penguins %>% 
  top_n(5, wt = body_mass_g)
penguins %>% 
  top_n(5, wt = body_mass_g)

penguins %>% 
  slice_max(order_by = body_mass_g, n = 5)

新slice_*()功能最重大的變化是為分組數(shù)據(jù)幀添加了適當?shù)男袨?/p>

例如惰许,下面的示例返回每種物種的重量百分比最高的5%的企鵝:

penguins %>% 
  group_by(species) %>% 
  slice_max(body_mass_g, prop = .05)

7.按組進行計數(shù)和求和 add_count()

add_count() 添加一列席覆,其中包含每個組(或組的組合)的計數(shù)

##### Long Form #####
# penguins %>% 
#   group_by(species) %>% 
#   mutate(count_by_species = n()) %>% 
#   ungroup()

penguins %>% 
  add_count(species, name = "count_by_species") %>% 
  select(-contains("mm"))
 # A tibble: 333 x 6
     species island    body_mass_g sex     year count_by_species
     <fct>   <fct>           <int> <fct>  <int>            <int>
   1 Adelie  Torgersen        3750 male    2007              146
   2 Adelie  Torgersen        3800 female  2007              146
   3 Adelie  Torgersen        3250 female  2007              146
   4 Adelie  Torgersen        3450 female  2007              146
   5 Adelie  Torgersen        3650 male    2007              146
   6 Adelie  Torgersen        3625 female  2007              146
   7 Adelie  Torgersen        4675 male    2007              146
   8 Adelie  Torgersen        3200 female  2007              146
   9 Adelie  Torgersen        3800 male    2007              146
  10 Adelie  Torgersen        4400 male    2007              146
  # ... with 323 more rows

可以使用wt來按組有效地獲取總和(也許有點笨拙,但非常有用)

##### Long Form #####
# penguins %>% 
#   group_by(species) %>% 
#   mutate(total_weight_by_species = sum(body_mass_g)) %>% 
#   ungroup()
  
penguins %>% 
  add_count(species, wt = body_mass_g,
  name ="total_weight_by_species") %>% 
  select(-contains("mm"))
 # A tibble: 333 x 6
     species island    body_mass_g sex     year total_weight_by_species
     <fct>   <fct>           <int> <fct>  <int>                   <int>
   1 Adelie  Torgersen        3750 male    2007                  541100
   2 Adelie  Torgersen        3800 female  2007                  541100
   3 Adelie  Torgersen        3250 female  2007                  541100
   4 Adelie  Torgersen        3450 female  2007                  541100
   5 Adelie  Torgersen        3650 male    2007                  541100
   6 Adelie  Torgersen        3625 female  2007                  541100
   7 Adelie  Torgersen        4675 male    2007                  541100
   8 Adelie  Torgersen        3200 female  2007                  541100
   9 Adelie  Torgersen        3800 male    2007                  541100
  10 Adelie  Torgersen        4400 male    2007                  541100
  # ... with 323 more rows

默認情況下汹买,add_tally()添加行數(shù)佩伤,您已經(jīng)可以使用mutate(n = n())進行處理

penguins %>% 
  add_count(species, wt = body_mass_g, 
name = "total_weight_by_species") %>% 
  add_tally(wt = body_mass_g,
name = "total_weight_of_all_species") %>% 
  select(1:2, last_col(0):last_col(1))
  # A tibble: 333 x 4
     species island    total_weight_of_all_species total_weight_by_species
     <fct>   <fct>                           <int>                   <int>
   1 Adelie  Torgersen                     1400950                  541100
   2 Adelie  Torgersen                     1400950                  541100
   3 Adelie  Torgersen                     1400950                  541100
   4 Adelie  Torgersen                     1400950                  541100
   5 Adelie  Torgersen                     1400950                  541100
   6 Adelie  Torgersen                     1400950                  541100
   7 Adelie  Torgersen                     1400950                  541100
   8 Adelie  Torgersen                     1400950                  541100
   9 Adelie  Torgersen                     1400950                  541100
  10 Adelie  Torgersen                     1400950                  541100
  # ... with 323 more rows
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晦毙,隨后出現(xiàn)的幾起案子生巡,更是在濱河造成了極大的恐慌,老刑警劉巖见妒,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孤荣,死亡現(xiàn)場離奇詭異,居然都是意外死亡须揣,警方通過查閱死者的電腦和手機盐股,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來返敬,“玉大人遂庄,你說我怎么就攤上這事【⒃” “怎么了涛目?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵秸谢,是天一觀的道長。 經(jīng)常有香客問我霹肝,道長估蹄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任沫换,我火速辦了婚禮臭蚁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讯赏。我一直安慰自己垮兑,他們只是感情好,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布漱挎。 她就那樣靜靜地躺著系枪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪磕谅。 梳的紋絲不亂的頭發(fā)上私爷,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音膊夹,去河邊找鬼衬浑。 笑死,一個胖子當著我的面吹牛放刨,可吹牛的內(nèi)容都是我干的工秩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼宏榕,長吁一口氣:“原來是場噩夢啊……” “哼拓诸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起麻昼,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馋辈,沒想到半個月后抚芦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡迈螟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年叉抡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片答毫。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡褥民,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出洗搂,到底是詐尸還是另有隱情消返,我是刑警寧澤载弄,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站撵颊,受9級特大地震影響宇攻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜倡勇,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一逞刷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妻熊,春花似錦夸浅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厅目,卻和暖如春番枚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背损敷。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工葫笼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拗馒。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓路星,卻偏偏與公主長得像,于是被迫代替她去往敵國和親诱桂。 傳聞我的和親對象是個殘疾皇子洋丐,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容