R語言學(xué)習(xí)-- apply函數(shù)應(yīng)用舉例

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炮车,隨后出現(xiàn)的幾起案子舵变,更是在濱河造成了極大的恐慌酣溃,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纪隙,死亡現(xiàn)場離奇詭異赊豌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绵咱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門碘饼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悲伶,你說我怎么就攤上這事艾恼。” “怎么了麸锉?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵钠绍,是天一觀的道長。 經(jīng)常有香客問我花沉,道長柳爽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任碱屁,我火速辦了婚禮泻拦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘忽媒。我一直安慰自己争拐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布晦雨。 她就那樣靜靜地躺著架曹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闹瞧。 梳的紋絲不亂的頭發(fā)上绑雄,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機(jī)與錄音奥邮,去河邊找鬼万牺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛洽腺,可吹牛的內(nèi)容都是我干的脚粟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蘸朋,長吁一口氣:“原來是場噩夢啊……” “哼核无!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藕坯,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤团南,失蹤者是張志新(化名)和其女友劉穎噪沙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吐根,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡正歼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拷橘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朋腋。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖膜楷,靈堂內(nèi)的尸體忽然破棺而出旭咽,到底是詐尸還是另有隱情,我是刑警寧澤穷绵,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站特愿,受9級特大地震影響仲墨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揍障,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一目养、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毒嫡,春花似錦癌蚁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咬摇,卻和暖如春伐蒂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肛鹏。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工逸邦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人在扰。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓缕减,卻偏偏與公主長得像,于是被迫代替她去往敵國和親健田。 傳聞我的和親對象是個(gè)殘疾皇子烛卧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容