R语言学习R语言

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

2021-01-14  本文已影响0人  PhageNanoenzyme

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
上一篇下一篇

猜你喜欢

热点阅读