编程功能:DPLYR和PURRR中的NSE

回旋钻

当前,当我尝试将函数包装在我多次使用的dplyr und purrr进行的一些计算周围时,我遇到了非标准评估的一些问题。

我已经阅读了有关NSE的文章,也认为我知道我的功能无法正常工作的地方-但是,我不知道为什么会这样。

示例性地,我想将函数包装在以下计算周围,其中分组变量以及新变量的名称,所利用的分类变量和均值的输入变量应该是动态的:

 Data <- Data %>%
  group_by(WeekBeforeRelease) %>%
  mutate(visitors_genreother_instr = map_dbl(Genre_Category, ~ mean(Visitors[Genre_Category != .x]))) %>%
  ungroup() %>%
  as.data.frame()

其中描述变成这个功能为以下,使用NSE在这里

Function_Other <- function(ENDOGVAR, VARNAME, GROUP_MOVIE, GROUP_TIME){

  ENDOGVAR <- enquo(ENDOGVAR)
  VARNAME <- quo_name(enquo(VARNAME))
  GROUP_MOVIE <- enquo(GROUP_MOVIE)
  GROUP_TIME <- enquo(GROUP_TIME)

  Data <<- Data %>%
    group_by(!!GROUP_TIME) %>%
    mutate(!!VARNAME := map_dbl(!!GROUP_MOVIE, ~mean(!!ENDOGVAR[!!GROUP_MOVIE != .x]))) %>%
    ungroup() %>%
    as.data.frame()
}

但是,这似乎无法很好地处理均值计算中的带有括号的子集。如果我用Visitors代替!! ENDOGVAR,一切都会按预期进行。但是,按原样,它会产生以下错误:

Error in NextMethod("[") : object '.x' not found 

对于可以帮助我理解此问题的任何帮助,我感到很高兴。

在此先多谢!

回旋曲

阿克伦

我们可以将花!!括号括起来以避免任何优先操作,现在应该可以正常工作

library(tidyverse)
Function_Other <- function(ENDOGVAR, VARNAME, GROUP_MOVIE, GROUP_TIME){

  ENDOGVAR <- enquo(ENDOGVAR)
  VARNAME <- quo_name(enquo(VARNAME))
  GROUP_MOVIE <- enquo(GROUP_MOVIE)
  GROUP_TIME <- enquo(GROUP_TIME)

  Data %>%
    group_by(!!GROUP_TIME) %>%
    mutate(!!VARNAME := map_dbl(!!GROUP_MOVIE, ~
           mean((!!ENDOGVAR)[(!!GROUP_MOVIE) != .x]))) %>%
    ungroup() %>%
    as.data.frame()

}


Data <- mtcars
out <- Function_Other(mpg, newcol, am, gear)
head(out, 3)
#   mpg cyl disp  hp drat    wt  qsec vs am gear carb newcol
#1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4  21.05
#2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4  21.05
#3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1  21.05

更新资料

使用rlang 0.4.0(经过测试dplyr 0.8.2),我们还可以将其{{...}}用于替代,引用和取消引用。上一个函数可以写成

Function_OtherN <- function(ENDOGVAR, VARNAME, GROUP_MOVIE, GROUP_TIME){  


  Data %>%
    group_by({{GROUP_TIME}}) %>%
    mutate({{VARNAME}} := map_dbl({{GROUP_MOVIE}}, ~
           mean({{ENDOGVAR}}[{{GROUP_MOVIE}} != .x]))) %>%
    ungroup() %>%
    as.data.frame()

}


out1 <- Function_OtherN(mpg, newcol, am, gear)

-检查先前的输出

identical(out1, out)
[1] TRUE

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用户编写的函数中存在purrr + dplyr NSE问题

来自分类Dev

dplyr:NSE加入中(作者)

来自分类Dev

dplyr和非标准评估(NSE)

来自分类Dev

函数中的dplyr NSE模式:嵌套条件

来自分类Dev

如果我想使类似dplyr的功能能够与NSE和SE一起使用,如何使用{{}}和all_off()解决问题?

来自分类Dev

dplyr / purrr遍历列和行

来自分类Dev

如何使用dplyr在NSE中获取变量的名称

来自分类Dev

使用 NSE 时出错(在 dplyr 中):找不到对象“值”

来自分类Dev

数组中的Javascript功能编程和动态值

来自分类Dev

批处理和功能编程

来自分类Dev

功能编程和内存管理

来自分类Dev

批处理和功能编程

来自分类Dev

Scala中的功能参数评估(功能编程)

来自分类Dev

使用dplyr和NSE动态构造具有不同参数的函数调用

来自分类Dev

使用dplyr和purrr反复变异变量

来自分类Dev

purrr::map 和 dplyr 的冗余变量命名问题

来自分类Dev

dplyr的filter_中的非标准评估(NSE),并从MySQL中提取数据

来自分类Dev

在OpenGL中混合使用固定功能管道和可编程管道

来自分类Dev

了解dplyr管道和汇总功能

来自分类Dev

为什么“分离”和“联合”功能在 dplyr 中不起作用

来自分类Dev

以编程方式评估Clojure中的功能列表

来自分类Dev

功能编程中的滑动窗口匹配

来自分类Dev

R编程中Shiny的identify()功能

来自分类Dev

R编程中Shiny的identify()功能

来自分类Dev

Java 1.7中的编程功能方式

来自分类Dev

在函数式编程中重用功能

来自分类Dev

如何在dplyr函数的左侧执行NSE?

来自分类Dev

在 dplyr::case_when 中使用 NSE

来自分类Dev

计算分组数据框中的唯一字符值:dplyr :: count(),stringr :: str_count()和/或purrr :: map()

Related 相关文章

热门标签

归档