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