天天看點

R實戰 第六篇:資料變換(aggregate+dplyr)

資料分析的工作,80%的時間耗費在處理資料上,而資料處理的主要過程可以分為:分離-操作-結合(Split-Apply-Combine),也就是說,首先,把資料根據特定的字段分組,每個分組都是獨立的;然後,對每個分組按照業務需求執行轉換;最後,把轉換後的結果組合在一起。在資料進行中,經常需要循環通路資料,R語言是矢量化的,天生具有處理循環操作的優勢。

使用ggplot2包中的diamonds資料集做為示例資料

> install.packages('ggplot2')
> library(ggplot2)
> data("diamonds")      

data()函數的作用是加載指定的資料集,本例将加載ggplot2包中的diamonds資料集,這個資料集在下文直接引用。

一,使用aggregate()函數做資料變換

在研究資料時,有時需要對資料按照特定的字段進行分組,然後統計各個分組的資料,這就是SQL文法中的分組-聚合操作,使用aggregate()函數對資料進行簡單的資料處理。

aggregate()函數用于把資料分離為單獨的子集,為每一個子集計算聚合值,然後把聚合值結合(combine)在一起傳回。

aggregate(formula, data, FUN, ...,subset, na.action = na.omit)      

參數注釋:

  • formula:指定formula對象,包括符号“ ~”,以及在符号“~”兩側的變量,左側代表要計算聚合值的變量(聚合變量),右側代表分組的變量,例如,price~cut,函數依據分組變量,把資料分離為多個單獨的子集。
  • data:指定操作的資料框;
  • FUN:該參數用于指定函數,該函數應用在符号“~”左側的變量;
  • ...:指定傳遞給FUN函數的其他參數;
  • subset:向量類型,可選參數,用于指定data的觀測子集;
  • na.action: 如何處理缺失值,預設為忽略NA。如果不選擇na.omit,則需指定函數去處理NA。

1,單個分組變量

使用aggregate() 函數操作diamonds資料集,按照cut字段分組,函數mean的作用是為每個分組計算prince的平均值:

aggregate(price~cut,diamonds,mean)      

2,多個分組變量

aggregate()函數能夠添加多個分組變量,隻需要在formula右側添加變量,并用加号“+”隔離:

> aggregate(price~cut+color,diamonds,mean)
         cut color    price
1       Fair     D 4291.061
2       Good     D 3405.382
3  Very Good     D 3470.467
....      

3,多個聚合變量

aggregate()函數能夠添加多個聚合變量,隻需要在formula左側,使用函數cbind()把兩個變量組合起來:

> aggregate(cbind(price,carat)~cut,diamonds,mean)
        cut    price     carat
1      Fair 4358.758 1.0461366
2      Good 3928.864 0.8491847
3 Very Good 3981.760 0.8063814
4   Premium 4584.258 0.8919549
5     Ideal 3457.542 0.7028370      

4,多個分組變量和多個聚合變量

aggregate()函數能夠formular對象的兩側分别添加多個變量,按照多個分組變量和多個聚合變量執行聚合運算

> aggregate(cbind(price,carat)~cut+color,diamonds,mean)
         cut color    price     carat
1       Fair     D 4291.061 0.9201227
2       Good     D 3405.382 0.7445166
....      

二,計數

R中計數比較特殊,plyr包中有一個計算函數count(),參數vars定義分組的變量,該函數會把重複值計算N次:

count(df, vars = NULL)      

使用aggregate()來實作分組計數,使用length(x)來計算向量中元素的個數,該函數會把重複值計算N次:

aggregate(cut~color,diamonds,length)      

為了計算唯一值的數量,可以使用unique(x),在計數之前,對向量元素去重:

aggregate(cut~color,diamonds,function(x) length(unique(x)))      

三,資料變換(dplyr包)

dplyr包提供靈活的資料操作,用于對資料框執行轉化和重塑,這個包是plyr包的更新版本,側重于處理資料框對象,是以其名字帶d(data frame),dplyr包是R開發人員必學必會的包。

dplyr包有三個主要的目标:

  •  更加靈活和簡單地處理資料框;
  • 使用記憶體,提高資料處理的性能;
  • 使用相同的接口處理資料,無論資料存儲在何處,無論是在資料框中,資料表或資料庫。

1,tlb類型

dplyr包不是預設安裝的包,在使用之前,需要使用以下指令安裝和引用dplyr包:

install.packages("dplyr")
library(dplyr)      

dplyr

包隻能用于tibble(簡稱tbl)類型的對象,tibble 類型是dplyr包特有的對象類型(data frame tbl / tbl_df)。在利用

dplyr

包處理資料之前,建議把資料框裝載成tibble類型,可以調用 

tbl_df()

函數把資料框類型轉化成 tibble 類型的資料對象:

> df <- tbl_df(diamonds)      

2,投影函數(

select)

從tbl對象中,選擇特定的資料列顯示,select()函數的第一個參數是tibble對象,後續的參數是tbl對象中的變量名:

> select(df,carat,cut,color)      

2,篩選函數(

filter)

從tbl對象中,按照特定的條件過濾資料:

> filter(df,color=='E')      

3,轉換函數(mutate)

根據tbl對象中的資料,應用指定的公式,派生新的資料列,或重寫已經存在的資料列:

> mutate(df,avg_ct=price/carat)      

4,彙總函數(summarize)

對tbl對象執行聚合運算,如果tbl對象已經被分組,那麼單獨對每個分組進行聚合運算:

> summarize(df,avg_prince=mean(price),avg_ct=mean(carat))      

5,分組函數(group_by)和移除分組(ungroup)

使用group_by()函數對tbl對象執行分組,被分組之後,tbl對象處于分組狀态,可以使用ungroup函數,移除tbl對象的分組狀态。

group_by(df,color)      

6,排序函數(arrange)

arrange()函數對tbl變量進行排序,預設是按照字段的升序值排序,使用desc(field),可以按照字段的降序值排序:

> arrange(df,color)      

7,管道操作符(%>%)

管道操作符(%>%)用于把前一步操作的結果集(變量類型是tbl)傳遞到給函數的第一個參數中,同時函數的第一個參數可以省略,例如:

> df %>% group_by(color) %>% summarize(mean(price))
# A tibble: 7 x 2
  color `mean(price)`
  <ord>         <dbl>
1     D      3169.954
2     E      3076.752
3     F      3724.886
4     G      3999.136
5     H      4486.669
6     I      5091.875
7     J      5323.818      

8,連接配接操作(join)

dplyr包還提供了連接配接(join)操作,

inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
semi_join(x, y, by = NULL, copy = FALSE, ...)
anti_join(x, y, by = NULL, copy = FALSE, ...)      
  • by:設定兩個資料集用于比對的字段名,預設使用全部的同名字段進行比對,如果兩個資料集需要比對的字段名不同,可以直接用等号指定比對的字段名,例如, by = c("a" = "b"),表示用x.a和y.b進行比對。
  • copy:如果兩個資料集來自不同的資料源,copy設定為TRUE時,會把資料集y的資料複制到資料集x中,出于性能上的考慮,需要謹慎設定copy參數為TRUE。
  • suffix:合并後的資料集中同名變量,會自動添加suffix中設定的字尾加以區分。

9,集合操作(set)

#取兩個集合的交集
intersect(x,y, ...)

#取兩個集合的并集,并進行去重
union(x,y, ...)

#取兩個集合的并集,不去重
union_all(x,y, ...)

#取兩個集合的差集
setdiff(x,y, ...)

#判斷兩個集合是否相等
setequal(x, y, ...)      

10,綁定操作

dplyr包提供了按行/列合并資料集的函數,合并的對象為資料框,也可以是能夠轉換為資料框的清單。按行合并函數bind_rows()通過列名進行比對,不比對的值使用NA替代,類似于base:: rbind()函數。按列合并函數bind_cols()通過行号比對,是以合并的資料框必須有相同的行數,函數類似于base:: cbind()函數。原資料集行名稱會被過濾掉。

#按行合并,.id添加新列用于指明合并後每條資料來自的源資料框
bind_rows(...,.id = NULL)

#按列合并
bind_cols(...)

#合并資料集
combine(...)      

11,排名操作

row_number(x)
ntile(x, n)
min_rank(x)
dense_rank(x)
percent_rank(x)
cume_dist(x)      

例如,對一個向量的元素進行排序:

x <- c(5, 1, 3, 2, 2, NA)
row_number(x)      

12,去重

對資料對象去重

distinct(data, ..., keep_all = FALSE)      
  • data:tbl對象
  • ... :可選的變量,用于指定去重的變量,如果去重的變量不唯一,那麼隻保留第一個觀測
  • keep_all:設定為TRUE時,所有的變量都保留到.data,如果...的組合不唯一,那麼隻保留第一行的觀測的各個變量值

13,計數

計數使用函數 n() 來實作,而統計資料集中無重複值的數量使用函數 n_distinct()來實作:

n()
n_distinct(..., na.rm = FALSE)      

統計各個分組的觀測數量,隻能用于 summarise(), mutate() 和 filter() 中

carriers <- group_by(flights, carrier)
summarise(carriers, n())
mutate(carriers, n = n())
filter(carriers, n() < 100)      

參考文檔:

【R語言】必學包之dplyr包

R語言滴水穿石系列文章(一):dplyr-高效的資料變換與整理工具

R語言擴充包dplyr筆記

R: 矩陣運算及常用函數 II - aggregate

作者

:悅光陰

出處

:http://www.cnblogs.com/ljhdo/

本文版權歸作者和部落格園所有,歡迎轉載,但未經作者同意,必須保留此段聲明,且在文章頁面醒目位置顯示原文連接配接,否則保留追究法律責任的權利。

繼續閱讀