前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「R」curly curly,更好的非标准计算

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

作者头像
王诗翔呀
发布2020-07-03 17:53:38
6860
发布2020-07-03 17:53:38
举报
文章被收录于专栏:优雅R优雅R

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

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

代码语言:javascript
复制
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()!!操作符。

代码语言:javascript
复制
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 包是有区别的:

代码语言:javascript
复制
var <- sample(c("woof", "meow", "mooh"), size = 1)
glue::glue("Did you just say {var}?")
#> Did you just say mooh?

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

代码语言:javascript
复制
  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 代词:
代码语言:javascript
复制
  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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档