R语言学习-- apply函数应用举例

apply函数是生信技能树生信爆款入门课程R语言部分Day7的讲到的一个重要知识点。为加深理解,现在找个数据做下练习巩固。首先学习下这个函数,然后再开始练习。

apply()族函数简介

>  apply(X, MARGIN, FUN,...)
>  -x: 一个数组或者矩阵
> -MARGIN: 两种数值1或者2决定对哪一个维度进行函数计算
> -MARGIN=1`: 操作基于行
>  -MARGIN=2`: 操作基于列
>  -MARGIN=c(1,2)`: 对行和列都进行操作
>  -FUN: 使用哪种操作,内置的函数有mean(平均值)、medium(中位数)、sum(求和)、min(最小值)、max(最大值),当然还包括广大的用户自定义函数
> lapply,在list上逐个元素调用FUN。可以用于dataframe上,因为dataframe是一种特殊形式的list。用于一个列表对象,返回一个列表对象
> tapply(),更灵活,可接受向量或者矩阵作为主要参数,返回形式更为有好的结果,常常是表格形式。

生成一个测试数据

> 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 
> #循环方式求值,较麻烦
> 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.对列表中的每个元素(向量)求均值

> ### 提示.lapply(list, FUN, …) 
> # 对列表/向量中的每个元素(向量)实施相同的操作
> 
> 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每个元素的最小值

> ### sapply 处理列表,简化结果,直接返回矩阵和向量
> 
> sapply(test,min)
 x  y  z 
33 32 27 

6.分别使用lapply和sappl求test的每个元素的最大最小值,并查看结果类别。

> 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列转为字符型,得到一个新矩阵

 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容