专栏首页优雅R「R」curly curly,更好的非标准计算

「R」curly curly,更好的非标准计算

本文整理自 https://www.tidyverse.org/articles/2019/06/rlang-0-4-0/,有删改

rlang v0.4.0引入了新的非标准计算操作符 {{。这大大方便了dplyr重编程。

library(dplyr)

starwars %>%
  group_by(gender) %>%
  summarise(mass_maximum = max(mass, na.rm = TRUE))
#> # A tibble: 5 x 2
#>   gender        mass_maximum
#>   <chr>                <dbl>
#> 1 <NA>                    75
#> 2 female                  75
#> 3 hermaphrodite         1358
#> 4 male                   159
#> 5 none                   140

将需要执行非标准计算的变量名使用{{}}括起来即可,不再需要enquo()!!操作符。

max_by <- function(data, var, by) {
  data %>%
    group_by({{ by }}) %>%
    summarise(maximum = max({{ var }}, na.rm = TRUE))
}

starwars %>% max_by(height)
#> # A tibble: 1 x 1
#>   maximum
#>     <int>
#> 1     264

starwars %>% max_by(height, by = gender)
#> # A tibble: 5 x 2
#>   gender        maximum
#>   <chr>           <int>
#> 1 <NA>              167
#> 2 female            213
#> 3 hermaphrodite     175
#> 4 male              264
#> 5 none              200

注意这个语法和 glue 包是有区别的:

var <- sample(c("woof", "meow", "mooh"), size = 1)
glue::glue("Did you just say {var}?")
#> Did you just say mooh?

如果需要传递多个变量,还是使用...

  summarise_by <- function(data, ..., by) {
    data %>%
      group_by({{ by }}) %>%
      summarise(...)
  }
  
  starwars %>%
    summarise_by(
      average = mean(height, na.rm = TRUE),
      maximum = max(height, na.rm = TRUE),
      by = gender
    )
  #> # A tibble: 5 x 3
  #>   gender        average maximum
  #>   <chr>           <dbl>   <int>
  #> 1 <NA>             120      167
  #> 2 female           165.     213
  #> 3 hermaphrodite    175      175
  #> 4 male             179.     264
  #> 5 none             200      200

现在enquos()!!!只有在需要修改输入或者名字时才需要用到。

  • 如果有字符串输入,使用 .data 代词:
  max_by <- function(data, var, by) {
    data %>%
      group_by(.data[[by]]) %>%
      summarise(maximum = max(.data[[var]], na.rm = TRUE))
  }
  
  starwars %>% max_by("height", by = "gender")
  #> # A tibble: 5 x 2
  #>   gender        maximum
  #>   <chr>           <int>
  #> 1 <NA>              167
  #> 2 female            213
  #> 3 hermaphrodite     175
  #> 4 male              264
  #> 5 none              200

这里magrittr 提供的 . 代词并不适用,因为它代表整个数据框,但是.data这里代表的是当前的子数据集。

参考资料

[1]

new programming vignette in ggplot2: https://ggplot2.tidyverse.org/dev/articles/ggplot2-in-packages.html#using-aes-and-vars-in-a-package-function

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

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

原始发表时间:2020-05-03

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • FancyHeatmap,支持输出嵌入网站了!

    FancyHeatmap,是我给TBtools中“卡通式热图”命的名字。前述,在公众号上,我已经推出了这个功能相关的新手教程。在后续,我也发现有不少人已经应用:

    王诗翔呀
  • 「R」UCSCXenaShiny:基于 R 的 Xena 数据库交互应用

    项目地址:https://github.com/openbiox/UCSCXenaShiny[1]

    王诗翔呀
  • 「R」Windows R 安装包显示无法锁定目录怎么搞?

    参考:https://stackoverflow.com/questions/14382209/r-install-packages-returns-faile...

    王诗翔呀
  • 吐血干货 | 量化、算法、机器学习交易书单完整目录

    量化投资与机器学习微信公众号
  • 100张经典信息可视化图表,让你脑洞大开

    01-Redefining the Dome by National Geographic

    钱塘数据
  • 100张经典信息可视化图表 看看你的大脑在想什么

    大数据文摘
  • 100张经典信息可视化图表,让你脑洞大开

    本文作者:JoAnn ? 18世纪50年代霍乱时期, John Snow绘制的一张霍乱疫情的位置图, 并通过该图表找到了霍乱疫情源头所在。 那时起,信息设计便已...

    钱塘数据
  • 「首席架构师推荐」最棒的的Flutter库,工具,教程,文章列表

    Flutter是一款移动应用SDK,可通过单一代码库为iOS和Android构建高性能,高保真的应用。

    首席架构师智库
  • Hive : SORT BY vs ORDER BY vs DISTRIBUTE BY vs CLUSTER BY

    在Apache Hive中,像SQL一样,您可以根据全局排序和分布要求决定对数据进行全局排序或局部排序。在这篇文章中,我们将了解Hive中的SORT BY,OR...

    Spark学习技巧
  • flask 数据库增删改查(flask 27)

    create note=Note() db.session.add(note) db.session.commit()

    用户5760343

扫码关注云+社区

领取腾讯云代金券