R語言常用的數據處理的包(1)

在R中有很多的內置函數,比如transform()、rbind()、cbind()等函數,這些函數我們可以直接使用,除此之外,還有常見的幾種包在處理數據的時候非常好用。

dplyr包

dplyr包是Hadley Wickham(ggplot2包的作者,被稱為‘一個改變R的人’)的杰作, dplyr可用于處理R內部或者外部的結構化數據,相較于plyr包,dplyr專注接受dataframe對象, 大幅提高了速度,并且提供了更穩健的數據庫接口。

一、篩選: filter系列

filter、filter_all、filter_at、filter_if
用法:filter(.data, 條件...)
這里我們用R的內置數據集作為例子(mtcars)

    filter(mtcars, cyl == 8)  
    filter(mtcars, cyl < 6)  
    #過濾出cyl < 6 并且 vs == 1的行  

    filter(mtcars, cyl < 6 & vs == 1)  
    filter(mtcars, cyl < 6, vs == 1)  
    #過濾出cyl < 6 或者 vs == 1的行  
    filter(mtcars, cyl < 6 | vs == 1)  
    #過濾出cyl 為4或6的行  
    filter(mtcars, cyl %in% c(4, 6))  

基于filter函數的用法,擴展出了一些新的函數

1filter_all(mtcars, any_vars(. > 150)) #篩選任何變量>150的樣本
2filter_at(mtcars, vars(starts_with("d")), any_vars((. %% 2) == 0)) 
3#篩選變量以“d”結尾,并且變量 "%%2" 等于0
4filter_if(mtcars, ~ all(floor(.) == .), all_vars(. != 0))
5# 篩選變量向下取整 == 原變量數值, 并且這部分變量的數值!= 0 的樣本集
二、slice函數

用法:slice(.data, ...)
用處: slice() 函數通過行號選取數據

#選取第一行的數據
slice(mtcars, 1L)  
filter(mtcars, row_number() == 1L)  
#選取最后一行數據  
slice(mtcars, n())  
filter(mtcars, row_number() == n())  
#選取第5行到最后一行所有數據  
slice(mtcars, 5:n())  
filter(mtcars, between(row_number(), 5, n()))  

這個函數在實際中并不常用,但是在某些情況下就會非常好用。

三、排列: arrange

用法:arrange(.data, ...)
arrange()按給定的列名依次對行進行排序,默認是按照升序排序,對列名加 desc() 可實現倒序排序。原數據集行名稱會被過濾掉

#以cyl和disp聯合升序排序 ,如果cyl相同,按照disp 
  arrange(mtcars, cyl, disp)  
#以disp降序排序  
  arrange(mtcars, desc(disp))  
四、選擇: select

用法:select(.data, ...)

#選取變量名前綴包含Petal的列  
select(iris, starts_with("Petal"))  
#選取變量名前綴不包含Petal的列  
select(iris, -starts_with("Petal"))  
#選取變量名后綴包含Width的列  
select(iris, ends_with("Width"))  
#選取變量名后綴不包含Width的列  
select(iris, -ends_with("Width"))  
#選取變量名中包含etal的列  
select(iris, contains("etal"))  
#選取變量名中不包含etal的列  
select(iris, -contains("etal"))  
#正則表達式匹配,返回變量名中包含t的列  
select(iris, matches(".t."))  
#正則表達式匹配,返回變量名中不包含t的列  
select(iris, -matches(".t."))  
#直接選取列  
select(iris, Petal.Length, Petal.Width)  
#返回除Petal.Length和Petal.Width之外的所有列  
select(iris, -Petal.Length, -Petal.Width)  
#使用冒號連接列名,選擇多個列  
select(iris, Sepal.Length:Petal.Width)  
#選擇字符向量中的列,select中不能直接使用字符向量篩選,需要使用one_of函數  
vars <- c("Petal.Length", "Petal.Width")  
select(iris, one_of(vars))  
#返回指定字符向量之外的列  
select(iris, -one_of(vars))  
#返回所有列,一般調整數據集中變量順序時使用  
select(iris, everything())  
#調整列順序,把Species列放到最前面  
select(iris, Species, everything()) 

一般我們用select函數選擇一個數據的幾列

    df <- as.data.frame(matrix(runif(100), nrow = 10))  
    df <- tbl_df(df[c(3, 4, 7, 1, 9, 8, 5, 2, 6, 10)])  
    #選擇V4,V5,V6三列  
    select(df, V4:V6)  
    select(df, num_range("V", 4:6))  
五、變形: mutate

用法:mutate(.data, ...)
mutate()函數對已有列進行數據運算并添加為新列,

    #添加新列wt_kg和wt_t,在同一語句中可以使用剛添加的列  
    mutate(mtcars, wt_kg = wt * 453.592, wt_t = wt_kg / 1000)  
    #計算新列wt_kg和wt_t,返回對象中只包含新列  
    transmute(mtcars, wt_kg = wt * 453.592, wt_t = wt_kg / 1000)  
六、分組: group

用法:group_by(.data, ..., add = FALSE)
group_by()用于對數據集按照給定變量分組,返回分組后的數據集。對返回后的數據集使用以上介紹的函數時,會自動的對分組數據操作。

    #使用變量cyl對mtcars分組,返回分組后數據集  
    by_cyl <- group_by(mtcars, cyl)  
    #返回每個分組中最大disp所在的行  
    filter(by_cyl, disp == max(disp))  
    #返回每個分組中變量名包含d的列,始終返回分組列cyl  
    select(by_cyl, contains("d"))  
    #使用mpg對每個分組排序  
    arrange(by_cyl,  mpg)  
    #對每個分組無重復的取2行記錄  
    sample_n(by_cyl, 2)  
七、數據關聯:join

類似于merge的用法

 #內連接,合并數據僅保留匹配的記錄

  inner_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) 

  #左連接,向數據集x中加入匹配的數據集y記錄

  left_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

  #右連接,向數據集y中加入匹配的數據集x記錄

  right_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...) 

  #全連接,合并數據保留所有記錄,所有行

  full_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

  #返回能夠與y表匹配的x表所有記錄 

  semi_join(x,y, by = NULL, copy = FALSE, ...)

  #返回無法與y表匹配的x表的所有記錄
  anti_join(x, y, by = NULL, copy = FALSE, ...) 

當然,dplyr不止這一種用法,希望各位道友一起補充,豐富我們的數據數據經驗和生信分析的工作。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容