美文网首页计算机@linux_python_R 技术帖R语言知识干货
R语言与生信应用22-R语法-apply函数家族

R语言与生信应用22-R语法-apply函数家族

作者: BioSi | 来源:发表于2019-05-09 22:01 被阅读152次

命令行的循环

循环对于编程十分重要,但在R交互式命令行中编写循环结构不太方便,R提供了一系列函数来简化循环操作。

  • lapply: 对一个列表进行循环,对列表中的,每个元素执行指定的函数操作,返回与原列表等长的结果
  • sapply: 与 lapply 相同,简化结果
  • apply: 对数组或矩阵执行指定的函数,返回向量、数组或列表
  • tapply: 对向量的子集进行操作
  • mapply: lapplysapply 的升级版

split 函数辅助 lapply 会产生一些神操作。


lapply

lapply 需要三个参数:
(1) 列表 X;
(2) 函数或函数名FUN;
(3) 其他参数通过 ... 参数传递。
如果 X 不是列表,会通过 as.list 函数强制转换为列表。

> lapply
function (X, FUN, ...) 
{
    FUN <- match.fun(FUN)
    if (!is.vector(X) || is.object(X)) 
        X <- as.list(X)
    .Internal(lapply(X, FUN))
}
<bytecode: 0x7fd35e9dc718>
<environment: namespace:base>

实际循环操作是通过内部的C代码完成。


lapply 函数或返回一个列表,但会忽略输入数据的类型。

> x <- list(a = 1:5, b = rnorm(10))
> lapply(x, mean)
$a
[1] 3

$b
[1] -0.1843325


> x <- list(a = 1:4, b = rnorm(10), c = rnorm(20, 1), d = rnorm(100, 5))
> lapply(x, mean)
$a
[1] 2.5

$b
[1] -0.1599965

$c
[1] 1.068789

$d
[1] 4.837933


> x <- 1:4
> lapply(x, runif)
[[1]]
[1] 0.9785864

[[2]]
[1] 0.5644791 0.9242951

[[3]]
[1] 0.9274006 0.3646827 0.2551950

[[4]]
[1] 0.3987640 0.5774553 0.7631348 0.7837444

> x <- 1:4
> lapply(x, runif, min = 0, max = 10)
[[1]]
[1] 4.615299

[[2]]
[1] 3.011078 5.549246

[[3]]
[1] 8.5230253 3.4520337 0.1495026

[[4]]
[1] 5.9855820 7.7427082 2.9215029 0.3520867


lapply 也可以使用匿名函数

# 声明包含两个矩阵的列表
> x <- list(a = matrix(1:4, 2, 2), b = matrix(1:6, 3, 2)) 
> x
$a
     [,1] [,2]
[1,]    1    3
[2,]    2    4

$b
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6


# 提取每个矩阵的第一列的匿名函数
> lapply(x, function(elt) elt[,1])
$a
[1] 1 2

$b
[1] 1 2 3


sapply

sapply 会尽可能的简化 lapply 函数的结果。

  • 如果列表中的每个元素的长度为1,结果会返回一个向量。
  • 如果列表中的每个元素都是长度大于1的等长向量,结果会返回一个矩阵。
  • 如果无法简化,返回列表。

> x <- list(a = 1:4, b = rnorm(10), c = rnorm(20, 1), d = rnorm(100, 5))
> lapply(x, mean)
$a
[1] 2.5

$b
[1] 0.3727818

$c
[1] 1.17464

$d
[1] 5.07108

> sapply(x, mean)
        a         b         c         d 
2.5000000 0.3727818 1.1746396 5.0710795 
> mean(x)
[1] NA
Warning message:
In mean.default(x) : argument is not numeric or logical: returning NA

课程分享
生信技能树全球公益巡讲
https://mp.weixin.qq.com/s/E9ykuIbc-2Ja9HOY0bn_6g
B站公益74小时生信工程师教学视频合辑
https://mp.weixin.qq.com/s/IyFK7l_WBAiUgqQi8O7Hxw
招学徒:
https://mp.weixin.qq.com/s/KgbilzXnFjbKKunuw7NVfw

相关文章

网友评论

    本文标题:R语言与生信应用22-R语法-apply函数家族

    本文链接:https://www.haomeiwen.com/subject/nvnonqtx.html