在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不止這一種用法,希望各位道友一起補充,豐富我們的數據數據經驗和生信分析的工作。