“ No one konws everything, and you don't have to.” --科白君本期為大家推薦在數(shù)據(jù)分析過程中常用的包dplyr。通過該包中幾個(gè)函數(shù)的單獨(dú)和/或聯(lián)合使用能夠輕松解決大多數(shù)據(jù)分析問題。這些函數(shù)包括數(shù)據(jù)排序(arrange),挑選變量(select),篩選變量(filter),添加列/變量(mutate)以及匯總(summarize)。 像excel一樣, R語言也能夠?qū)?shù)據(jù)分析進(jìn)行排序。對數(shù)據(jù)的排序很重要,它不僅能夠讓我們大概地了解目標(biāo)變量的數(shù)據(jù)結(jié)構(gòu),在畫圖的過程中排序與某些函數(shù)的聯(lián)用還能夠讓我們按照期望的方式出圖。上代碼: rm(list=ls()) library(tidyverse) #該報(bào)包含了幾個(gè)常用的R包,包括但不限于dplyr #調(diào)用內(nèi)部數(shù)據(jù) data("mtcars") #“%>%”讀作然后,是一種管道的方式進(jìn)行數(shù)據(jù)運(yùn)算;它的好處用時(shí)自見 str(mtcars) dt<-mtcars %>% as_tibble(rownames="names")#data.frame change to tibble #why? mtcars dt  這是原始的data.frame(數(shù)據(jù)框)數(shù)據(jù),可以看到當(dāng)我們預(yù)覽數(shù)據(jù)時(shí)會出現(xiàn)一大堆的數(shù)據(jù)。但是,有時(shí)候我們并不關(guān)心所有的數(shù)據(jù),我們僅僅只為驗(yàn)證數(shù)據(jù)結(jié)構(gòu)是否符合我們的預(yù)期。在此時(shí),顯然tibble數(shù)據(jù)更能滿足我們的要求。如下:
當(dāng)我們想要對數(shù)據(jù)排序時(shí),我們可能有以下幾個(gè)要求: 1)對A變量從小到大升序;
dt %>% arrange(cyl) #1)對cyl從小到大升序 
2)對A變量從大到小降序; dt %>% arrange(desc(cyl)) #2)對cyl從大到小降序 
3)在對A變量從小到大降序后,對B,C變量從小到大降序。
dt %>% arrange(desc(cyl,mpg,vs)) #3)先對cyl降序,接著對mpg降序,再對vs降序  有時(shí)候我們并不需要對所有的變量進(jìn)行數(shù)據(jù)分析,我們可能只關(guān)心數(shù)據(jù)中的一兩個(gè)變量,這樣我們只需要把這些關(guān)心的變量從原來的數(shù)據(jù)中拿出來即可。#select variable dt %>% select(mpg,cyl,gear) #the other way to select target variable dt[,c(1,2,11] 但是,當(dāng)我們的變量比較多時(shí),采用第二種方法挑選目標(biāo)變量就比較麻煩了。

除了挑選變量,有時(shí)候我們用的更多的可能是根據(jù)一些條件對數(shù)據(jù)進(jìn)行篩選,如去除空值"NA"的行,或者選出符合特定條件的行。
1)選出所有vs變量中大于0的值 dt %>% filter(vs>0) #選出除所有vs大于0的值 
2)選出所有vs變量中大于0“且”am變量中也大于0的值
dt %>% filter(vs>0,am>0) #選出所有vs大于0,“且”am>0的值 
3)選出所有變量中vs“非”0的值 
4)更多運(yùn)算符的含義“,”表示“且”,表示同時(shí)滿足多個(gè)條件;“&”表示“與”;“|”表示“或”;“=>”表示大于等于;“<=”表示小于等于
有時(shí)候,我們對某個(gè)變量進(jìn)行運(yùn)算后,希望該變量合并到原始的數(shù)據(jù)中,這就需要一個(gè)重要的函數(shù)mutate了。
如,我想計(jì)算mpg與cyl的比值,并把它們的比值添加到數(shù)據(jù)的第一列: dt %>% mutate(mpg_cyl = mpg/cyl) %>% select(mpg_cyl,everything()) 
其實(shí)我想把它倆的比值(mpg_cyl)添加到第二列: dt %>% mutate(mpg_cyl = mpg/cyl) %>% select(names,mpg_cyl,everything()) 
dt %>% mutate(group = ifelse(vs=="0","small","big")) %>% #添加分組 select(names,group,everything()) %>% group_by(group) %>% summarize(mpg_mean = mean(mpg,na.rm = TRUE)) #可以考慮一下na.rm的含義是什么? 
2)我想對數(shù)據(jù)中選出的幾個(gè)變量進(jìn)行運(yùn)算,如求和,求平均值等
dt %>% mutate(group = ifelse(cyl < 6,"small", ifelse(cyl > 6,"big", "median"))) %>% select(group,mpg,cyl,disp) %>% reshape2::melt(id="group") %>% group_by(group,variable) %>% summarize(value_sum = sum(value,na.rm = TRUE)) %>% reshape2::dcast(group ~ variable, value.var = "value_sum") 
這串代碼的意思如下:1)首先我想根據(jù)cyl變量的大小把所有的數(shù)據(jù)分為三個(gè)組,分別是小于6的為small組,大于6的為big組,中間的為median組;2)然后因?yàn)槲蚁雽pg,cyl和disp這三個(gè)變量求和,所以我單獨(dú)的選出了這三列,因?yàn)槿绻謩e對這三個(gè)變量求和的話,需要在求和時(shí)寫三串代碼(當(dāng)然其實(shí)也可以,但是如果是100個(gè)甚至1w個(gè)變量呢?),所以我把寬數(shù)據(jù)轉(zhuǎn)變?yōu)榱碎L數(shù)據(jù),這樣就變1個(gè)分組為2個(gè)分組了(分別是group和variable);3)然后我根據(jù)這兩個(gè)分組對目標(biāo)的3個(gè)變量求和,并去除空值(na.rm=TRUE); 4)最后我還是想以寬數(shù)據(jù)的形式展示,所以我又把長數(shù)據(jù)轉(zhuǎn)換為了寬數(shù)據(jù)(具體畫圖時(shí)可以根據(jù)自己的需要選擇是否轉(zhuǎn)變回來)。
除此之外,summarize還有其它運(yùn)算,如求方差,中位數(shù),等等??梢允褂萌缦麓a查看:
|