在使用dplyr编程时如何使用括号表示法(或替代方法)

在使用dplyr编程时如何使用括号表示法(或替代方法),r,dplyr,rlang,R,Dplyr,Rlang,我正在尝试编写一个函数来计算toplines(在轮询数据中常用)。它需要同时包含“百分比”和“有效百分比”列 这里有一个例子 library(tidyverse) 我正在努力实现有效百分比列。这是我尝试过的语法 make.topline2 <- function(variable, data, weight){ variable <- enquo(variable) weight <- enquo(weight) table <- data %>%

我正在尝试编写一个函数来计算toplines(在轮询数据中常用)。它需要同时包含“百分比”和“有效百分比”列

这里有一个例子

library(tidyverse)

我正在努力实现有效百分比列。这是我尝试过的语法

make.topline2 <- function(variable, data, weight){
  variable <- enquo(variable)
  weight <- enquo(weight)

  table <- data %>%
    # calculate denominator
    mutate(total = sum(!!weight),
           valid.total = sum(!!weight[!!variable != "(Missing)"])) %>%
    # calculate proportions
    group_by(!!variable) %>%
    summarise(pct = (sum(!!weight)/first(total))*100,
              valid.pct = (sum(!!weight)/first(valid.total))*100,
              n = sum(!!weight))

  table
}

make.topline2(variable = tvhours2, data = d, weight = fakeweight)
我知道这方面存在问题,但我不知道如何解决:

mutate(valid.total = sum(!!weight[!!variable != "(Missing)"]))

您可以在
周围加括号!!重量
。我认为这是为了确保只有在
weight
未被引用(因此是一个操作顺序)之后才使用提取括号

这条线看起来像:

valid.total=sum(!!weight)[!!变量!=“(缺失)”)

或者,您可以使用新的curly-curly操作符(
{{
),它可以代替
enquo()
/
!!
组合来处理像您这样相对简单的情况

make.topline <- function(variable, data, weight){

    table <- data %>%
        # calculate denominator
        mutate(total = sum({{ weight }}),
               valid.total = sum({{ weight }}[{{ variable }} != "(Missing)"])) %>%
        # calculate proportions
        group_by({{ variable }}) %>%
        summarise(pct = (sum({{ weight }})/first(total))*100,
                  valid.pct = (sum({{ weight }})/first(valid.total))*100,
                  n = sum({{ weight }}))

    table
}
make.topline%
#计算比例
分组依据({{variable}})%>%
总结(pct=(总和({{{weight}})/第一(总计))*100,
valid.pct=(和({{{weight}})/first(valid.total))*100,
n=和({{weight}}))
桌子
}
与圆括号解决方案一样,它运行时不会出错

make.topline(variable = tvhours2, data = d, weight = fakeweight)

# A tibble: 9 x 4
  tvhours2    pct valid.pct      n
  <fct>     <dbl>     <dbl>  <dbl>
1 0          3.16      5.98   679.
2 1         10.9      20.6   2342.
3 2         14.1      26.6   3022.
4 3          9.10     17.2   1957.
5 4          6.67     12.6   1432.
6 5          3.24      6.13   696.
7 6-8        4.02      7.61   864.
8 9+         1.67      3.16   358.
9 (Missing) 47.2      89.3  10140.
make.topline(变量=tvhours2,数据=d,重量=fakeweight)
#一个tibble:9x4
tvhours2 pct有效。pct n
1 0          3.16      5.98   679.
2 1         10.9      20.6   2342.
3 2         14.1      26.6   3022.
4 3          9.10     17.2   1957.
5 4          6.67     12.6   1432.
6 5          3.24      6.13   696.
7 6-8        4.02      7.61   864.
8 9+         1.67      3.16   358.
9(缺失)47.2 89.3 10140。

请您提供一些gss_cat作为测试数据集(使用
dput()
)。看看
rlang
中的新
{
操作符。我知道这听起来可能有点奇怪,但请尝试在
!!weight
周围加上括号。如
valid.total=sum(!!weight)[!!variable!=“(缺失)”)
。我想用
{{
代替
enquo()
!!
也可以。谢谢大家!括号解决方案很有效。我将查看
{{
选项也有。@aosmith,如果您提交您的建议作为答案,我将很乐意接受。@Richard Telford,gss_cat数据集是forcats包的一部分,因此它将与我的第一行
库(tidyverse)一起加载。
 Error: Base operators are not defined for quosures.
Do you need to unquote the quosure?

  # Bad:
  myquosure != rhs

  # Good:
  !!myquosure != rhs
Call `rlang::last_error()` to see a backtrace 
mutate(valid.total = sum(!!weight[!!variable != "(Missing)"]))
make.topline <- function(variable, data, weight){

    table <- data %>%
        # calculate denominator
        mutate(total = sum({{ weight }}),
               valid.total = sum({{ weight }}[{{ variable }} != "(Missing)"])) %>%
        # calculate proportions
        group_by({{ variable }}) %>%
        summarise(pct = (sum({{ weight }})/first(total))*100,
                  valid.pct = (sum({{ weight }})/first(valid.total))*100,
                  n = sum({{ weight }}))

    table
}
make.topline(variable = tvhours2, data = d, weight = fakeweight)

# A tibble: 9 x 4
  tvhours2    pct valid.pct      n
  <fct>     <dbl>     <dbl>  <dbl>
1 0          3.16      5.98   679.
2 1         10.9      20.6   2342.
3 2         14.1      26.6   3022.
4 3          9.10     17.2   1957.
5 4          6.67     12.6   1432.
6 5          3.24      6.13   696.
7 6-8        4.02      7.61   864.
8 9+         1.67      3.16   358.
9 (Missing) 47.2      89.3  10140.