专栏首页优雅R「R」简单理解lapply,sapply,vapply

「R」简单理解lapply,sapply,vapply

在我之前转载的文章《apply,lapply,sapply用法探索》中已经对R中apply家族函数进行了比较详细地说明,这篇文章基于我在data campus中对lapplysapplyvapply几个函数的学习,以更为简单的实例来了解这几个以列表对输入的迭代函数。

使用的是一组温度数据,每天测5次,连续测量一个星期。

我们先将其输入R:

temp <- list(c(3, 7, 9, 6, -1), c(6, 9, 12, 13, 5), c(4, 8, 3, -1, -3
), c(1, 4, 7, 2, -2), c(5, 7, 9, 4, 2), c(-3, 5, 8, 9, 4), c(3,
                                                             6, 9, 4, 1))

我们进行迭代计算的函数是basics,它计算每一天温度的最小、最大值、平均值以及中位数。

# Definition of the basics() function
basics <- function(x) {
  c(min = min(x), mean = mean(x), median = median(x), max = max(x))
}

lapply最为常见,以列表为输入,以列表为输出。

> lapply(temp, basics)
[[1]]
   min   mean median    max
  -1.0    4.8    6.0    9.0

[[2]]
   min   mean median    max
     5      9      9     13

[[3]]
   min   mean median    max
  -3.0    2.2    3.0    8.0

[[4]]
   min   mean median    max
  -2.0    2.4    2.0    7.0

[[5]]
   min   mean median    max
   2.0    5.4    5.0    9.0

[[6]]
   min   mean median    max
  -3.0    4.6    5.0    9.0

[[7]]
   min   mean median    max
   1.0    4.6    4.0    9.0

可以看出,如果迭代次数够大,结果会非常冗长,但我们所需要的结果其实可以以比较紧凑的数组(矩阵)展示出来。因此,我们可以使用sapply函数,s前缀即简化之意。

> sapply(temp, basics)
       [,1] [,2] [,3] [,4] [,5] [,6] [,7]
min    -1.0    5 -3.0 -2.0  2.0 -3.0  1.0
mean    4.8    9  2.2  2.4  5.4  4.6  4.6
median  6.0    9  3.0  2.0  5.0  5.0  4.0
max     9.0   13  8.0  7.0  9.0  9.0  9.0

是否已经足够紧凑?

记得,如果你使用迭代计算的结果不是一个向量,就不要使用sapply进行简化计算。

最后想要介绍的函数vapply其实是为sapply加了一层验证选项:

> vapply(temp, basics, numeric(4))
       [,1] [,2] [,3] [,4] [,5] [,6] [,7]
min    -1.0    5 -3.0 -2.0  2.0 -3.0  1.0
mean    4.8    9  2.2  2.4  5.4  4.6  4.6
median  6.0    9  3.0  2.0  5.0  5.0  4.0
max     9.0   13  8.0  7.0  9.0  9.0  9.0
> vapply(temp, basics, numeric(3))
Error in vapply(temp, basics, numeric(3)) : 值的长度必需为3,
 但FUN(X[[1]])结果的长度却是4
 ```

 读者可以发现,当第三个参数其实就是验证选项,命名为`FUN.VALUE`。

 ```R
 > args(vapply)
function (X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)
NULL

我们知道每次迭代计算应该返回4个数值型结果,所以当我们设置为numeric(3)时它会报错。这个函数及其选项的设定在我们编写比较大型的迭代计算和整合函数代码时非常有用,可以帮助我们快速检验结果的有效性,尽量避免调试bug带来的苦恼。

Once you know about vapply(), there's really no reason to use sapply() anymore. If the output that lapply() would generate can be simplified to an array, you'll want to use vapply() to do this securely. If simplification is not possible, simply stick to lapply().

本文分享自微信公众号 - 优雅R(elegant-r),作者:王诗翔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「R」无影腿快不过组合拳?均值计算哪家强

    昨天我在公众号推文中提了一个非常有意思的问题:mean() 和 sum() / length() 哪一个更快?

    王诗翔呀
  • 《陈巍学基因》笔记①illumina测序化学原理

    欢迎大家打开本次推送~从本期推送开始,将由 ? 小编为大家整理《陈巍学基因》的笔记。

    王诗翔呀
  • 「R」倾向评分匹配算法——R实例学习

    倾向评分算法用于校正模型中的混淆因子,这里我们先使用随机生成的数据学习该算法,然后实际分析一下去教会学校和公共学校上学学生的成绩差异。

    王诗翔呀
  • Nginx 的这些妙用,你都 get 到了吗?

    Nginx 因为它的稳定性、丰富的模块库、灵活的配置和较低的资源消耗而闻名 。目前应该是几乎所有项目建设必备。今天通过这篇攻略让你快速通关 Nginx。

    黄泽杰
  • 基于面部照片的亲属关系预测的深度神经网络

    https://www.kaggle.com/c/recognizing-faces-in-the-wild/data

    代码医生工作室
  • 二代测序的基因组数据分析入门(illumina测序原理篇)

    本着“三百六十行,行行转生信”的崇高宗旨,基础科研、生物学出身的小编在今年成功进入生信圈,入坑的时候才发现贵圈真的是太乱了,不仅要敲的了代码,跑的了数据,而且跨...

    用户6317549
  • 转载[Linux/Ubuntu] vi/vim 使用方法讲解

    源地址:http://www.cnblogs.com/emanlee/archive/2011/11/10/2243930.html

    用户2965768
  • vi/vim基本使用方法

    在minicom终端里修改开发板中的文件时,必须要用到vi,因为开发板中并不像开发主机那样,有gedit和kscope这样的编辑器;还有,即便是在开...

    魏晓蕾
  • 大牧絮叨设计模式:装饰器模式

    装饰器模式(Decorator)[GOF95]是一种结构模式,通常情况下我们扩展一个类型的功能,优先选择的方案会是通过继承的方式进行功能扩展,但是Java单继承...

    大牧莫邪
  • 如何处理新建的SAP CRM产品category没有出现在列表的问题

    Issue description: I create a new product category ZTESTJERRY3:

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券