NSE使用dplyr的do()处理复杂表达式

特里莎(Trisha)

有人可以帮助我理解当变量引用采用形式时NSE如何与dplyr一起工作".$mpg"

这里阅读之后,我认为使用as.name可以做到这一点,因为我有一个给出变量名的字符串。

例如,这有效:

mtcars %>% 
summarise_(interp(~mean(var), var = as.name("mpg")))

这是行不通的:

mtcars %>% 
summarise_(interp(~mean(var), var = as.name(".$mpg")))

但这确实是:

mtcars %>% 
 summarise(mean(.$mpg)) 

这样:

mtcars %>%
summarise(mean(mpg)) 

我希望能够以表格的形式指定变量,.$mpg以便在没有为数据指定点的选项时可以将其与do()结合使用,如以下示例所示:

library(dplyr)
library(broom)

mtcars %>% 
 tbl_df() %>% 
 slice(., 1) %>% 
 do(tidy(prop.test(.$mpg, .$disp, p = .50)))
  • 在这里选择了随机变量来演示prop.test函数的工作方式,请不要将其解释为滥用测试。

最终,我想将其转换为如下功能:

 library(lazyeval)
 library(broom)
 library(dplyr)


p_test <- function(x, miles, distance){
        x %>% 
         tbl_df() %>% 
         slice(., 1) %>% 
         do_(tidy(prop.test(miles, distance, p = .50))) 
  }

p_test(mtcars, ".$mpg", ".$disp")

我本来以为我必须做类似的事情:用替换掉interp(~var, var = as.name(miles)哪里,但是正如我在顶部提到的那样,这似乎行不通。miles.$mpg

康拉德·鲁道夫(Konrad Rudolph)

原因是as.name创建了一个未评估的变量名,但是.$mpg在代码中使用时,它不是变量名。而是一个复杂的表达式,它等效于:

`$`(., mpg)

也就是说,它是$带有两个参数的函数调用使用as.name导致R随后搜索具有名称的变量,`.$mpg`而不是调用上述函数。

这就是为什么您的尝试不起作用的解释。这样,解决方案就相对简单了:我们需要创建一个未评估的函数调用表达式,而不是创建一个未评估的变量名。我们可以通过多种方式来完成此操作,在这里我将展示两个。

首先是简单地调用parse

p_test = function (data, miles, distance) {
    x = parse(text = miles)[[1]]
    n = parse(text = distance)[[1]]
    data %>%
        slice(1) %>%
        do_(interp(~tidy(prop.test(x, n, p = 0.5)), x = x, n = n))
}

现在,您可以致电p_test(mtcars, '.$mpg', '.$disp')并获得所需的结果。

但是,做同样事情的更dplyr -y方法是将未评估的对象传递给p_test

p_test(mtcars, mpg, disp)

…并且我们可以通过一个简单的更改轻松地做到这一点:

p_test_ = function (data, var1, var2) {
    data %>%
        slice(1) %>%
        do_(interp(~tidy(prop.test(.$x, .$n, p = 0.5)),
                   x = as.name(var1), n = as.name(var2)))
}

p_test = function (data, var1, var2) {
    p_test_(data, substitute(var1), substitute(var2))
}

现在,以下两段代码都可以正常工作:

p_test(mtcars, mpg, disp)
p_test_(mtcars, 'mpg', 'disp')

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

处理复杂的正则表达式

来自分类Dev

Javascript - 如何使用正则表达式处理以下复杂字符串

来自分类Dev

复杂的正则表达式可处理数字序列

来自分类Dev

在dplyr :: mutate()上下文中在dplyr :: case_when()中使用复杂的RHS表达式

来自分类Dev

复杂的指针表达式

来自分类Dev

如何使用NSE并使用...(省略号)过滤表达式?

来自分类Dev

尝试使用正则表达式解析Java中的复杂布尔表达式

来自分类Dev

Grep无法使用复杂的正则表达式

来自分类Dev

使用用户EasyIn的复杂条件表达式。

来自分类Dev

在asp.net上使用IF的复杂绑定表达式

来自分类Dev

使用“条件”构建复杂的正则表达式

来自分类Dev

复杂的使用正则表达式查找和替换

来自分类Dev

名称和表达式之间的典型NSE区分

来自分类Dev

使用正则表达式来处理日志文件:合并正则表达式

来自分类Dev

优化复杂的SQL表达式

来自分类Dev

jQuery表达式的复杂性

来自分类Dev

python中的复杂表达式减少

来自分类Dev

复杂密码的正则表达式

来自分类Dev

正则表达式过于复杂

来自分类Dev

复杂的正则表达式

来自分类Dev

复杂的复合布尔表达式

来自分类Dev

复杂的数学表达式C#

来自分类Dev

解析复杂的数学表达式

来自分类Dev

PHP复杂正则表达式

来自分类Dev

PostgreSQL中的ORDER BY复杂表达式

来自分类Dev

复杂类型属性的表达式

来自分类Dev

关于“:”的复杂正则表达式

来自分类Dev

正则表达式复杂模式

来自分类Dev

Vim 复杂的正则表达式