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