在R中有很多的內(nèi)置函數(shù)凰浮,比如transform()我抠、rbind()、cbind()等函數(shù)袜茧,這些函數(shù)我們可以直接使用菜拓,除此之外,還有常見的幾種包在處理數(shù)據(jù)的時(shí)候非常好用惫周。
dplyr包
dplyr包是Hadley Wickham(ggplot2包的作者尘惧,被稱為‘一個(gè)改變R的人’)的杰作, dplyr可用于處理R內(nèi)部或者外部的結(jié)構(gòu)化數(shù)據(jù)递递,相較于plyr包喷橙,dplyr專注接受dataframe對(duì)象, 大幅提高了速度,并且提供了更穩(wěn)健的數(shù)據(jù)庫接口。
一登舞、篩選: filter系列
filter贰逾、filter_all、filter_at菠秒、filter_if
用法:filter(.data, 條件...)
這里我們用R的內(nèi)置數(shù)據(jù)集作為例子(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函數(shù)的用法疙剑,擴(kuò)展出了一些新的函數(shù)
1filter_all(mtcars, any_vars(. > 150)) #篩選任何變量>150的樣本
2filter_at(mtcars, vars(starts_with("d")), any_vars((. %% 2) == 0))
3#篩選變量以“d”結(jié)尾,并且變量 "%%2" 等于0
4filter_if(mtcars, ~ all(floor(.) == .), all_vars(. != 0))
5# 篩選變量向下取整 == 原變量數(shù)值, 并且這部分變量的數(shù)值践叠!= 0 的樣本集
二言缤、slice函數(shù)
用法:slice(.data, ...)
用處: slice() 函數(shù)通過行號(hào)選取數(shù)據(jù)
#選取第一行的數(shù)據(jù)
slice(mtcars, 1L)
filter(mtcars, row_number() == 1L)
#選取最后一行數(shù)據(jù)
slice(mtcars, n())
filter(mtcars, row_number() == n())
#選取第5行到最后一行所有數(shù)據(jù)
slice(mtcars, 5:n())
filter(mtcars, between(row_number(), 5, n()))
這個(gè)函數(shù)在實(shí)際中并不常用,但是在某些情況下就會(huì)非常好用禁灼。
三管挟、排列: arrange
用法:arrange(.data, ...)
arrange()按給定的列名依次對(duì)行進(jìn)行排序,默認(rèn)是按照升序排序弄捕,對(duì)列名加 desc() 可實(shí)現(xiàn)倒序排序僻孝。原數(shù)據(jù)集行名稱會(huì)被過濾掉。
#以cyl和disp聯(lián)合升序排序 ,如果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"))
#正則表達(dá)式匹配,返回變量名中包含t的列
select(iris, matches(".t."))
#正則表達(dá)式匹配斋荞,返回變量名中不包含t的列
select(iris, -matches(".t."))
#直接選取列
select(iris, Petal.Length, Petal.Width)
#返回除Petal.Length和Petal.Width之外的所有列
select(iris, -Petal.Length, -Petal.Width)
#使用冒號(hào)連接列名荞雏,選擇多個(gè)列
select(iris, Sepal.Length:Petal.Width)
#選擇字符向量中的列,select中不能直接使用字符向量篩選,需要使用one_of函數(shù)
vars <- c("Petal.Length", "Petal.Width")
select(iris, one_of(vars))
#返回指定字符向量之外的列
select(iris, -one_of(vars))
#返回所有列讯檐,一般調(diào)整數(shù)據(jù)集中變量順序時(shí)使用
select(iris, everything())
#調(diào)整列順序羡疗,把Species列放到最前面
select(iris, Species, everything())
一般我們用select函數(shù)選擇一個(gè)數(shù)據(jù)的幾列
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()函數(shù)對(duì)已有列進(jìn)行數(shù)據(jù)運(yùn)算并添加為新列柳刮,
#添加新列wt_kg和wt_t,在同一語句中可以使用剛添加的列
mutate(mtcars, wt_kg = wt * 453.592, wt_t = wt_kg / 1000)
#計(jì)算新列wt_kg和wt_t挖垛,返回對(duì)象中只包含新列
transmute(mtcars, wt_kg = wt * 453.592, wt_t = wt_kg / 1000)
六、分組: group
用法:group_by(.data, ..., add = FALSE)
group_by()用于對(duì)數(shù)據(jù)集按照給定變量分組秉颗,返回分組后的數(shù)據(jù)集痢毒。對(duì)返回后的數(shù)據(jù)集使用以上介紹的函數(shù)時(shí),會(huì)自動(dòng)的對(duì)分組數(shù)據(jù)操作蚕甥。
#使用變量cyl對(duì)mtcars分組哪替,返回分組后數(shù)據(jù)集
by_cyl <- group_by(mtcars, cyl)
#返回每個(gè)分組中最大disp所在的行
filter(by_cyl, disp == max(disp))
#返回每個(gè)分組中變量名包含d的列,始終返回分組列cyl
select(by_cyl, contains("d"))
#使用mpg對(duì)每個(gè)分組排序
arrange(by_cyl, mpg)
#對(duì)每個(gè)分組無重復(fù)的取2行記錄
sample_n(by_cyl, 2)
七菇怀、數(shù)據(jù)關(guān)聯(lián):join
類似于merge的用法
#內(nèi)連接凭舶,合并數(shù)據(jù)僅保留匹配的記錄
inner_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
#左連接,向數(shù)據(jù)集x中加入匹配的數(shù)據(jù)集y記錄
left_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
#右連接爱沟,向數(shù)據(jù)集y中加入匹配的數(shù)據(jù)集x記錄
right_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
#全連接帅霜,合并數(shù)據(jù)保留所有記錄,所有行
full_join(x,y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)
#返回能夠與y表匹配的x表所有記錄
semi_join(x,y, by = NULL, copy = FALSE, ...)
#返回?zé)o法與y表匹配的x表的所有記錄
anti_join(x, y, by = NULL, copy = FALSE, ...)
當(dāng)然呼伸,dplyr不止這一種用法身冀,希望各位道友一起補(bǔ)充,豐富我們的數(shù)據(jù)數(shù)據(jù)經(jīng)驗(yàn)和生信分析的工作括享。