學習tidyverse - 數(shù)據(jù)轉(zhuǎn)換(1)

可視化是一個重要工具肠虽,但是我們需要把數(shù)據(jù)整理成正確的形式來進行可視化遭居。通常啼器,需要創(chuàng)建一些新的變量或摘要,或者重命名變量或?qū)τ^察值進行重新排序魏滚,以使數(shù)據(jù)可視化起來更容易一些镀首。
接下來我們主要會使用到dplyr包,主要涉及到filter(), arrange(), select()三個函數(shù)鼠次。

1. Prerequisites

library(nycflights13)
library(tidyverse)

2. nycflights13

我們使用nycflights13 :: flights來探索dplyr的基本數(shù)據(jù)操作更哄。 此數(shù)據(jù)框包含2013年從紐約市出發(fā)的所有336,776個航班。

flights
#> # A tibble: 336,776 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # … with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

3. dplyr basics

(1)使用 filter() 過濾行

filter()基于觀測值將其子集化腥寇。 第一個參數(shù)是數(shù)據(jù)框的名稱成翩。 第二個和后續(xù)參數(shù)是用于過濾數(shù)據(jù)的匹配表達式。 例如赦役,我們可以選擇1月1日的所有航班:

filter(flights, month == 1, day == 1)
#> # A tibble: 842 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # … with 836 more rows, and 11 more variables: arr_delay <dbl>, carrier <chr>,
#> #   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
#> #   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

如果要保存結(jié)果麻敌,則需要使用賦值運算符<-

jan1 <- filter(flights, month == 1, day == 1)

R可以打印出結(jié)果,也可以將它們保存到變量中掂摔。 如果想兩者都做术羔,可以將賦值用括號()括起來:

(dec25 <- filter(flights, month == 12, day == 25))
#> # A tibble: 719 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013    12    25      456            500        -4      649            651
#> 2  2013    12    25      524            515         9      805            814
#> 3  2013    12    25      542            540         2      832            850
#> 4  2013    12    25      546            550        -4     1022           1027
#> 5  2013    12    25      556            600        -4      730            745
#> 6  2013    12    25      557            600        -3      743            752
#> # … with 713 more rows, and 11 more variables: arr_delay <dbl>, carrier <chr>,
#> #   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
#> #   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
  • Comparisons
    為了有效地使用過濾赢赊,必須知道如何使用比較運算符。 R提供了標準比較運算符:>级历,>=释移,<,<=寥殖,!= 和 ==玩讳。使用==浮點數(shù)時,要注意以下問題嚼贡,將會判斷為FALSE熏纯。
sqrt(2) ^ 2 == 2
#> [1] FALSE
1 / 49 * 49 == 1
#> [1] FALSE

這種情況應(yīng)該使用near()

near(sqrt(2) ^ 2,  2)
#> [1] TRUE
near(1 / 49 * 49, 1)
#> [1] TRUE
  • Logical operators
    filter()的多個參數(shù)與and組合:每個表達式都必須為true,以便將一行包含在輸出中粤策。 樟澜,|!叮盘。 如下顯示了完整的布爾運算集往扔。

    以下代碼查找11月或12月出發(fā)的所有航班:
filter(flights, month == 11 | month == 12)

x %in% y: 其中x是y之一。 我們可以用它來重寫上面的代碼:

nov_dec <- filter(flights, month %in% c(11, 12))

如果要查找不延遲(到達或離開)兩個小時以上的航班熊户,則可以使用以下兩個過濾器之一:

filter(flights, !(arr_delay > 120 | dep_delay > 120))
filter(flights, arr_delay <= 120, dep_delay <= 120)
  • Missing values
NA > 5
#> [1] NA
10 == NA
#> [1] NA
NA + 10
#> [1] NA
NA / 2
#> [1] NA
NA == NA
#> [1] NA
is.na(x)
#> [1] TRUE

filter()僅包含條件為TRUE的行萍膛; 它不包括FALSE和NA值。 如果要保留缺失值嚷堡,需要明確指定:

df <- tibble(x = c(1, NA, 3))
filter(df, x > 1)
#> # A tibble: 1 x 1
#>       x
#>   <dbl>
#> 1     3
filter(df, is.na(x) | x > 1)
#> # A tibble: 2 x 1
#>       x
#>   <dbl>
#> 1    NA
#> 2     3
(2)使用 arrange() 重排行

arrange()filter()的工作原理類似蝗罗,不同之處在于,它不選擇行蝌戒,而是更改行的順序串塑。 它需要一個數(shù)據(jù)框和一組列名進行排序。

arrange(flights, year, month, day)
#> # A tibble: 336,776 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # … with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

降序排列

arrange(flights, desc(dep_delay))
#> # A tibble: 336,776 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     9      641            900      1301     1242           1530
#> 2  2013     6    15     1432           1935      1137     1607           2120
#> 3  2013     1    10     1121           1635      1126     1239           1810
#> 4  2013     9    20     1139           1845      1014     1457           2210
#> 5  2013     7    22      845           1600      1005     1044           1815
#> 6  2013     4    10     1100           1900       960     1342           2211
#> # … with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> #   carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
#> #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

缺失值總是排在最后:

df <- tibble(x = c(5, 2, NA))
arrange(df, x)
#> # A tibble: 3 x 1
#>       x
#>   <dbl>
#> 1     2
#> 2     5
#> 3    NA
arrange(df, desc(x))
#> # A tibble: 3 x 1
#>       x
#>   <dbl>
#> 1     5
#> 2     2
#> 3    NA

3. 使用 select() 選擇列

select()使用基于變量名稱的操作來快速提取有用的子集北苟。

# Select columns by name
select(flights, year, month, day)
#> # A tibble: 336,776 x 3
#>    year month   day
#>   <int> <int> <int>
#> 1  2013     1     1
#> 2  2013     1     1
#> 3  2013     1     1
#> 4  2013     1     1
#> 5  2013     1     1
#> 6  2013     1     1
#> # … with 336,770 more rows
# Select all columns between year and day (inclusive)
select(flights, year:day)
#> # A tibble: 336,776 x 3
#>    year month   day
#>   <int> <int> <int>
#> 1  2013     1     1
#> 2  2013     1     1
#> 3  2013     1     1
#> 4  2013     1     1
#> 5  2013     1     1
#> 6  2013     1     1
#> # … with 336,770 more rows
# Select all columns except those from year to day (inclusive)
select(flights, -(year:day))
#> # A tibble: 336,776 x 16
#>   dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier
#>      <int>          <int>     <dbl>    <int>          <int>     <dbl> <chr>  
#> 1      517            515         2      830            819        11 UA     
#> 2      533            529         4      850            830        20 UA     
#> 3      542            540         2      923            850        33 AA     
#> 4      544            545        -1     1004           1022       -18 B6     
#> 5      554            600        -6      812            837       -25 DL     
#> 6      554            558        -4      740            728        12 UA     
#> # … with 336,770 more rows, and 9 more variables: flight <int>, tailnum <chr>,
#> #   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
#> #   minute <dbl>, time_hour <dttm>

select()中可以使用許多輔助函數(shù):
starts_with("abc"):匹配以“ abc”開頭的名稱桩匪。
ends_with("xyz"):匹配以“ xyz”結(jié)尾的名稱。
contains("ijk"):匹配包含“ ijk”的名稱友鼻。
matchs("(.. \\ 1"):選擇與正則表達式匹配的變量傻昙。 該變量與任何包含重復(fù)字符的變量匹配。
num_range("x", 1:3):匹配x1彩扔,x2和x3妆档。

使用rename()更改列名。

rename(flights, tail_num = tailnum)
#> # A tibble: 336,776 x 19
#>    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
#>   <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
#> 1  2013     1     1      517            515         2      830            819
#> 2  2013     1     1      533            529         4      850            830
#> 3  2013     1     1      542            540         2      923            850
#> 4  2013     1     1      544            545        -1     1004           1022
#> 5  2013     1     1      554            600        -6      812            837
#> 6  2013     1     1      554            558        -4      740            728
#> # … with 336,770 more rows, and 11 more variables: arr_delay <dbl>,
#> #   carrier <chr>, flight <int>, tail_num <chr>, origin <chr>, dest <chr>,
#> #   air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>

另一個選擇是將select()everything()結(jié)合使用虫碉。 比如想將幾個變量移到數(shù)據(jù)框的開頭贾惦。

select(flights, time_hour, air_time, everything())
#> # A tibble: 336,776 x 19
#>   time_hour           air_time  year month   day dep_time sched_dep_time
#>   <dttm>                 <dbl> <int> <int> <int>    <int>          <int>
#> 1 2013-01-01 05:00:00      227  2013     1     1      517            515
#> 2 2013-01-01 05:00:00      227  2013     1     1      533            529
#> 3 2013-01-01 05:00:00      160  2013     1     1      542            540
#> 4 2013-01-01 05:00:00      183  2013     1     1      544            545
#> 5 2013-01-01 06:00:00      116  2013     1     1      554            600
#> 6 2013-01-01 05:00:00      150  2013     1     1      554            558
#> # … with 336,770 more rows, and 12 more variables: dep_delay <dbl>,
#> #   arr_time <int>, sched_arr_time <int>, arr_delay <dbl>, carrier <chr>,
#> #   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, distance <dbl>,
#> #   hour <dbl>, minute <dbl>

參考:https://r4ds.had.co.nz/transform.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子须板,更是在濱河造成了極大的恐慌碰镜,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件习瑰,死亡現(xiàn)場離奇詭異洋措,居然都是意外死亡,警方通過查閱死者的電腦和手機杰刽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來王滤,“玉大人贺嫂,你說我怎么就攤上這事⊙阆纾” “怎么了第喳?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長踱稍。 經(jīng)常有香客問我曲饱,道長,這世上最難降的妖魔是什么珠月? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任扩淀,我火速辦了婚禮,結(jié)果婚禮上啤挎,老公的妹妹穿的比我還像新娘驻谆。我一直安慰自己,他們只是感情好庆聘,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布胜臊。 她就那樣靜靜地躺著,像睡著了一般伙判。 火紅的嫁衣襯著肌膚如雪象对。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天宴抚,我揣著相機與錄音勒魔,去河邊找鬼。 笑死菇曲,一個胖子當著我的面吹牛沥邻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羊娃,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼唐全,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邮利,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤弥雹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后延届,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體剪勿,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年方庭,在試婚紗的時候發(fā)現(xiàn)自己被綠了厕吉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡械念,死狀恐怖头朱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情龄减,我是刑警寧澤项钮,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站希停,受9級特大地震影響烁巫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宠能,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一亚隙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧违崇,春花似錦恃鞋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肴楷,卻和暖如春水由,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赛蔫。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工砂客, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呵恢。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓鞠值,卻偏偏與公主長得像,于是被迫代替她去往敵國和親渗钉。 傳聞我的和親對象是個殘疾皇子彤恶,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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