在網上找了很久關於數據轉換的,都沒有找到比較好的。現在為大家整理一下。按照我自己的思路。當然也是為了自己做筆記。
為了方便,大家可以統一安裝一個系列的包,這個只需要安裝tidyverse這個包就可以,它會安裝一系列的數據處理的包,比如ggplot2,dplyr等主力的包。
#安裝tidyverse包
install.packages('tidyverse')
#加載這個包
library(tidyverse)
我現在使用的版本如下:
#需要先安裝devtools這個包
> devtools::session_info(c('tidyverse'))
Session info -------------------------------------------------------------------------------
setting value
version R version 3.4.4 (2018-03-15)
system x86_64, mingw32
ui RStudio (1.1.442)
language (EN)
collate Chinese (Simplified)_China.936
tz Asia/Taipei
date 2018-04-11
Packages -----------------------------------------------------------------------------------
package * version date source
assertthat 0.2.0 2017-04-11 CRAN (R 3.4.4)
backports 1.1.2 2017-12-13 CRAN (R 3.4.3)
base64enc 0.1-3 2015-07-28 CRAN (R 3.4.1)
BH 1.66.0-1 2018-02-13 CRAN (R 3.4.3)
bindr 0.1.1 2018-03-13 CRAN (R 3.4.4)
bindrcpp 0.2 2017-06-17 CRAN (R 3.4.4)
broom 0.4.3 2017-11-20 CRAN (R 3.4.3)
callr 2.0.2 2018-02-11 CRAN (R 3.4.4)
cellranger 1.1.0 2016-07-27 CRAN (R 3.4.4)
cli 1.0.0 2017-11-05 CRAN (R 3.4.4)
colorspace 1.3-2 2016-12-14 CRAN (R 3.4.4)
compiler 3.4.4 2018-03-15 local
crayon 1.3.4 2017-09-16 CRAN (R 3.4.4)
curl 3.1 2017-12-12 CRAN (R 3.4.3)
DBI 0.8 2018-03-02 CRAN (R 3.4.4)
dbplyr 1.2.1 2018-02-19 CRAN (R 3.4.4)
debugme 1.1.0 2017-10-22 CRAN (R 3.4.4)
dichromat 2.0-0 2013-01-24 CRAN (R 3.4.1)
digest 0.6.15 2018-01-28 CRAN (R 3.4.3)
dplyr 0.7.4 2017-09-28 CRAN (R 3.4.3)
evaluate 0.10.1 2017-06-24 CRAN (R 3.4.4)
forcats 0.3.0 2018-02-19 CRAN (R 3.4.4)
foreign 0.8-69 2017-06-22 CRAN (R 3.4.4)
ggplot2 2.2.1 2016-12-30 CRAN (R 3.4.4)
glue 1.2.0 2017-10-29 CRAN (R 3.4.4)
graphics * 3.4.4 2018-03-15 local
grDevices * 3.4.4 2018-03-15 local
grid 3.4.4 2018-03-15 local
gtable 0.2.0 2016-02-26 CRAN (R 3.4.4)
haven 1.1.1 2018-01-18 CRAN (R 3.4.4)
highr 0.6 2016-05-09 CRAN (R 3.4.4)
hms 0.4.2 2018-03-10 CRAN (R 3.4.4)
htmltools 0.3.6 2017-04-28 CRAN (R 3.4.4)
httr 1.3.1 2017-08-20 CRAN (R 3.4.4)
jsonlite 1.5 2017-06-01 CRAN (R 3.4.4)
knitr 1.20 2018-02-20 CRAN (R 3.4.4)
labeling 0.3 2014-08-23 CRAN (R 3.4.1)
lattice 0.20-35 2017-03-25 CRAN (R 3.4.4)
lazyeval 0.2.1 2017-10-29 CRAN (R 3.4.4)
lubridate 1.7.2 2018-02-06 CRAN (R 3.4.3)
magrittr 1.5 2014-11-22 CRAN (R 3.4.4)
markdown 0.8 2017-04-20 CRAN (R 3.4.4)
MASS 7.3-49 2018-02-23 CRAN (R 3.4.4)
methods * 3.4.4 2018-03-15 local
mime 0.5 2016-07-07 CRAN (R 3.4.1)
mnormt 1.5-5 2016-10-15 CRAN (R 3.4.1)
modelr 0.1.1 2017-07-24 CRAN (R 3.4.4)
munsell 0.4.3 2016-02-13 CRAN (R 3.4.4)
nlme 3.1-131.1 2018-02-16 CRAN (R 3.4.4)
openssl 1.0.1 2018-03-03 CRAN (R 3.4.4)
parallel 3.4.4 2018-03-15 local
pillar 1.2.1 2018-02-27 CRAN (R 3.4.4)
pkgconfig 2.0.1 2017-03-21 CRAN (R 3.4.4)
plogr 0.2.0 2018-03-25 CRAN (R 3.4.4)
plyr 1.8.4 2016-06-08 CRAN (R 3.4.4)
praise 1.0.0 2015-08-11 CRAN (R 3.4.4)
psych 1.7.8 2017-09-09 CRAN (R 3.4.4)
purrr 0.2.4 2017-10-18 CRAN (R 3.4.4)
R6 2.2.2 2017-06-17 CRAN (R 3.4.4)
RColorBrewer 1.1-2 2014-12-07 CRAN (R 3.4.1)
Rcpp 0.12.16 2018-03-13 CRAN (R 3.4.4)
readr 1.1.1 2017-05-16 CRAN (R 3.4.4)
readxl 1.0.0 2017-04-18 CRAN (R 3.4.4)
rematch 1.0.1 2016-04-21 CRAN (R 3.4.4)
reprex 0.1.2 2018-01-26 CRAN (R 3.4.4)
reshape2 1.4.3 2017-12-11 CRAN (R 3.4.4)
rlang 0.2.0 2018-02-20 CRAN (R 3.4.4)
rmarkdown 1.9 2018-03-01 CRAN (R 3.4.4)
rprojroot 1.3-2 2018-01-03 CRAN (R 3.4.4)
rstudioapi 0.7 2017-09-07 CRAN (R 3.4.4)
rvest 0.3.2 2016-06-17 CRAN (R 3.4.4)
scales 0.5.0 2017-08-24 CRAN (R 3.4.4)
selectr 0.3-2 2018-03-05 CRAN (R 3.4.4)
stats * 3.4.4 2018-03-15 local
stringi 1.1.7 2018-03-12 CRAN (R 3.4.4)
stringr 1.3.0 2018-02-19 CRAN (R 3.4.4)
testthat 2.0.0 2017-12-13 CRAN (R 3.4.4)
tibble 1.4.2 2018-01-22 CRAN (R 3.4.4)
tidyr 0.8.0 2018-01-29 CRAN (R 3.4.4)
tidyselect 0.2.4 2018-02-26 CRAN (R 3.4.4)
tidyverse 1.2.1 2017-11-14 CRAN (R 3.4.4)
tools 3.4.4 2018-03-15 local
utf8 1.1.3 2018-01-03 CRAN (R 3.4.4)
utils * 3.4.4 2018-03-15 local
viridisLite 0.3.0 2018-02-01 CRAN (R 3.4.4)
whisker 0.3-2 2013-04-28 CRAN (R 3.4.4)
withr 2.1.2 2018-03-15 CRAN (R 3.4.4)
xml2 1.2.0 2018-01-24 CRAN (R 3.4.4)
yaml 2.1.18 2018-03-08 CRAN (R 3.4.4)
我們選取一個航班的數據集,這個數據在下面這個包里面,也需要安裝
#安裝這個包
install.packages('nycflights13')
#加載這個包
library(nycflights13)
查看這個數據集(這個數據集包含2013年從紐約市出發的所有336778架航班)
> flights
# A tibble: 336,776 x 19
year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay
<int> <int> <int> <int> <int> <dbl> <int> <int> <dbl>
1 2013 1 1 517 515 2. 830 819 11.
2 2013 1 1 533 529 4. 850 830 20.
3 2013 1 1 542 540 2. 923 850 33.
4 2013 1 1 544 545 -1. 1004 1022 -18.
5 2013 1 1 554 600 -6. 812 837 -25.
6 2013 1 1 554 558 -4. 740 728 12.
7 2013 1 1 555 600 -5. 913 854 19.
8 2013 1 1 557 600 -3. 709 723 -14.
9 2013 1 1 557 600 -3. 838 846 -8.
10 2013 1 1 558 600 -2. 753 745 8.
# ... with 336,766 more rows, and 10 more variables: carrier <chr>, flight <int>,
# tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>,
# minute <dbl>, time_hour <dttm>
這個數據集其實是tibbles格式的,和R的普通的data.frame格式不一樣。但是差不多。在這個列名稱的下面會有這列的格式,比如int是整形的,dbl是雙精度型的,當然啦,R和別的語言不一樣,我覺得不要太關注他們的數據格式,大概知道哪些是連續的、哪些是離散的、哪些是字符型的,當然在特殊的情況下,需要考慮,我們現在就暫時不考慮。
好了好了,這些准備的東西就介紹到這吧。進入正題:
dplyr有幾個主要的函數。如下:
filter()——這個是按照他的值進行篩選
arrange()——這個就是排序呀!
select()——這個是通過變量名選擇變量
mutate()——這個是用現有的變量函數創建新變量
summarize()——這個是將許多值折疊為單個摘要(通常和group_by()函數在一起用,別說是我說的,我就是先透漏一下)
filter()函數
> 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
7 2013 1 1 555 600 -5. 913 854
8 2013 1 1 557 600 -3. 709 723
9 2013 1 1 557 600 -3. 838 846
10 2013 1 1 558 600 -2. 753 745
# ... with 832 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>
上面這個意思很明顯,就是選擇在這數據集中,month等於1且day等於1的行。看吧,很簡單吧,這個是生成一個新的數據,不對原來的數據框進行修改。
例如:
> (dec25 <- filter(flights,month == 1,day == 25))
# A tibble: 922 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 25 15 1815 360. 208 1958
2 2013 1 25 17 2249 88. 119 2357
3 2013 1 25 26 1850 336. 225 2055
4 2013 1 25 123 2000 323. 229 2101
5 2013 1 25 123 2029 294. 215 2140
6 2013 1 25 456 500 -4. 632 648
7 2013 1 25 519 525 -6. 804 820
8 2013 1 25 527 530 -3. 820 829
9 2013 1 25 535 540 -5. 826 850
10 2013 1 25 539 540 -1. 1006 1017
# ... with 912 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>
當然,也可以用一些邏輯符號,只要你邏輯清楚,都可以用,你只要保證你的數據集在filte()函數的最前面的位置,后面盡管添加約束條件。比如你可以這樣做:
> filter(flights,month == 11 | month == 12)#這個是選擇month等於11和等於12的列
# A tibble: 55,403 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 11 1 5 2359 6. 352 345
2 2013 11 1 35 2250 105. 123 2356
3 2013 11 1 455 500 -5. 641 651
4 2013 11 1 539 545 -6. 856 827
5 2013 11 1 542 545 -3. 831 855
6 2013 11 1 549 600 -11. 912 923
7 2013 11 1 550 600 -10. 705 659
8 2013 11 1 554 600 -6. 659 701
9 2013 11 1 554 600 -6. 826 827
10 2013 11 1 554 600 -6. 749 751
# ... with 55,393 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>
> (nov_dec <- filter(flights,month %in% c(11,12)))#這個是選擇month等於11和12的列
# A tibble: 55,403 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 11 1 5 2359 6. 352 345
2 2013 11 1 35 2250 105. 123 2356
3 2013 11 1 455 500 -5. 641 651
4 2013 11 1 539 545 -6. 856 827
5 2013 11 1 542 545 -3. 831 855
6 2013 11 1 549 600 -11. 912 923
7 2013 11 1 550 600 -10. 705 659
8 2013 11 1 554 600 -6. 659 701
9 2013 11 1 554 600 -6. 826 827
10 2013 11 1 554 600 -6. 749 751
# ... with 55,393 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>
> filter(flights,arr_delay <= 120,dep_delay <= 120)#這個可以選擇arr_delay小於等於120且dep_delay小於等於120的列
# A tibble: 316,050 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
7 2013 1 1 555 600 -5. 913 854
8 2013 1 1 557 600 -3. 709 723
9 2013 1 1 557 600 -3. 838 846
10 2013 1 1 558 600 -2. 753 745
# ... with 316,040 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>
那么遇到了缺失值怎么辦,怎么辦,怎么辦,,,,,,,
我來告訴你,那就是filter()會忽略所有缺失值,你可以看下面這個例子,仔細琢磨一下你就可以發現這個奧秘
> (df <- tibble(x = c(1,NA,3)))#不要驚慌,這個也就相當於構成一個data.frame()數據集,哎呀,差不多。不要怕
# A tibble: 3 x 1
x
<dbl>
1 1.
2 NA
3 3.
> filter(df,x > 1)
# A tibble: 1 x 1
x
<dbl>
1 3.
> filter(df,is.na(x) | x > 1)#看我,看這里,有沒有發現加上一個is.na(x)就出現缺失值了。厲害吧
# A tibble: 2 x 1
x
<dbl>
1 NA
2 3.
今天就先寫這么多了,我女朋友找我了,溜了
