apply函數(shù)是生信技能樹生信爆款入門課程R語言部分Day7的講到的一個(gè)重要知識點(diǎn)绞蹦。為加深理解幻捏,現(xiàn)在找個(gè)數(shù)據(jù)做下練習(xí)鞏固宏所。首先學(xué)習(xí)下這個(gè)函數(shù),然后再開始練習(xí)壹堰。
apply()族函數(shù)簡介
> apply(X, MARGIN, FUN,...)
> -x: 一個(gè)數(shù)組或者矩陣
> -MARGIN: 兩種數(shù)值1或者2決定對哪一個(gè)維度進(jìn)行函數(shù)計(jì)算
> -MARGIN=1`: 操作基于行
> -MARGIN=2`: 操作基于列
> -MARGIN=c(1,2)`: 對行和列都進(jìn)行操作
> -FUN: 使用哪種操作拭卿,內(nèi)置的函數(shù)有mean(平均值)、medium(中位數(shù))贱纠、sum(求和)峻厚、min(最小值)、max(最大值)谆焊,當(dāng)然還包括廣大的用戶自定義函數(shù)
> lapply,在list上逐個(gè)元素調(diào)用FUN惠桃。可以用于dataframe上辖试,因?yàn)閐ataframe是一種特殊形式的list辜王。用于一個(gè)列表對象,返回一個(gè)列表對象
> tapply(),更靈活罐孝,可接受向量或者矩陣作為主要參數(shù)呐馆,返回形式更為有好的結(jié)果,常常是表格形式肾档。
生成一個(gè)測試數(shù)據(jù)
> rm(list = ls())
> test<- iris[1:4,1:4]
> test
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
3 4.7 3.2 1.3 0.2
4 4.6 3.1 1.5 0.2
> dim(test)
[1] 4 4
> rownames(test)
[1] "1" "2" "3" "4"
> colnames(test)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"
1.求每一列的平均值
> apply(test, 2, mean)
Sepal.Length Sepal.Width Petal.Length Petal.Width
4.825 3.200 1.400 0.200
2.求每一行的平均值
> apply(test, 1, sum)
1 2 3 4
10.2 9.5 9.4 9.4
> #循環(huán)方式求值摹恰,較麻煩
> res <- c()
>
> for(i in 1:nrow(test)){
+ res[[i]] <- sum(test[i,])
+ }
> res
[[1]]
[1] 10.2
[[2]]
[1] 9.5
[[3]]
[1] 9.4
[[4]]
[1] 9.4
3.對列表中的每個(gè)元素(向量)求均值
> ### 提示.lapply(list, FUN, …)
> # 對列表/向量中的每個(gè)元素(向量)實(shí)施相同的操作
>
> test <- list(x = 36:33,
+ y = 32:35,
+ z = 30:27)
> test
$x
[1] 36 35 34 33
$y
[1] 32 33 34 35
$z
[1] 30 29 28 27
> #返回值是列表辫继,
>
> lapply(test,mean)
$x
[1] 34.5
$y
[1] 33.5
$z
[1] 28.5
> class(lapply(test,mean))
[1] "list"
4.將lapply(test,mean)變成非列表形式
> x <- unlist(lapply(test,mean));x
x y z
34.5 33.5 28.5
> class(x)
[1] "numeric"
5. 使用sapply求test每個(gè)元素的最小值
> ### sapply 處理列表怒见,簡化結(jié)果,直接返回矩陣和向量
>
> sapply(test,min)
x y z
33 32 27
6.分別使用lapply和sappl求test的每個(gè)元素的最大最小值,并查看結(jié)果類別姑宽。
> lapply(test,range)
$x
[1] 33 36
$y
[1] 32 35
$z
[1] 27 30
> sapply(test,range)
x y z
[1,] 33 32 27
[2,] 36 35 30
>
> class(sapply(test,range))
[1] "matrix" "array"
> class(lapply(test,range))
[1] "list"
7.求test每一行的方差
> test<- iris[1:4,1:4]
> test
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
3 4.7 3.2 1.3 0.2
4 4.6 3.1 1.5 0.2
> apply(test,1,var)
1 2 3 4
4.750000 4.149167 3.990000 3.656667
>
8.嘗試將test前3列轉(zhuǎn)為字符型遣耍,得到一個(gè)新矩陣
test<- iris[1:4,1:4]
> test
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
3 4.7 3.2 1.3 0.2
4 4.6 3.1 1.5 0.2
> apply(test[,1:3], 2, as.character)
Sepal.Length Sepal.Width Petal.Length
[1,] "5.1" "3.5" "1.4"
[2,] "4.9" "3" "1.4"
[3,] "4.7" "3.2" "1.3"
[4,] "4.6" "3.1" "1.5"
9.對test每一列按照從小到大排序
> apply(test, 2, sort)
Sepal.Length Sepal.Width Petal.Length Petal.Width
[1,] 4.6 3.0 1.3 0.2
[2,] 4.7 3.1 1.4 0.2
[3,] 4.9 3.2 1.4 0.2
[4,] 5.1 3.5 1.5 0.2
10.對test每一行按照從大到小排序
> apply(test, 1, sort, decreasing=T)
1 2 3 4
Sepal.Length 5.1 4.9 4.7 4.6
Sepal.Width 3.5 3.0 3.2 3.1
Petal.Length 1.4 1.4 1.3 1.5
Petal.Width 0.2 0.2 0.2 0.2