在 dplyr 0.7.1 中排列函数
Arrange function in dplyr 0.7.1
我正在尝试使用新的 quo 功能,同时使用 dplyr 和 运行 将函数编写到以下问题中:
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 3, 1),
a = sample(5),
b = sample(5)
)
通过变量运行获取数据框很简单:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(!!quo_arrange_var)
}
但是如果我想设置一个优惠顺序呢?例如,任何 ar运行ge 变量都将 2 作为顶部变量,然后正常排序。对于以前版本的 dplyr,我会使用:
arrange(-(arrange_var == 2), arrange_var)
但在新结构中我不确定如何处理。我试过:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-!!quo_arrange_var==2, !!quo_arrange_var)
}
但我收到错误
Error in arrange_impl(.data, dots) :
incorrect size (1) at position 1, expecting : 5
我也试过使用 quo_name:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-!!(paste0(quo_name(quo_arrange_var), "==2")), !!quo_arrange_var)
}
但出现此错误:
Error in arrange_impl(.data, dots) :
Evaluation error: invalid argument to unary operator.
任何帮助将不胜感激
最简单的解决方法是在 bang-bang 两边加上括号。这与 !
和 ==
的运算符优先级有关。当你有 !!a==b
时,即使你想要 (!!a)==b
,它也会被解析为 !!(a==b)
。出于某种原因,您可以将 quosure 与数值 quo(a)==2
returns FALSE
进行比较,因此表达式的计算结果为 arrange(-FALSE, g2)
,这会给您相同的错误消息。
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-((!!quo_arrange_var)==2), !!quo_arrange_var)
}
my_arrange(df, g2)
# # A tibble: 5 x 4
# g1 g2 a b
# <dbl> <dbl> <int> <int>
# 1 1 2 5 4
# 2 1 1 2 5
# 3 2 1 4 3
# 4 2 1 3 1
# 5 2 3 1 2
tidyverse 已经进化,不再需要 enquo
。相反,我们将表达式括在双括号 {{ }}
中(也就是我们 embrace 它们)。
library("tidyverse")
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 3, 1),
a = sample(5),
b = sample(5)
)
my_arrange <- function(df, arrange_var) {
df %>%
arrange(desc({{ arrange_var }} == 2), {{ arrange_var }})
}
my_arrange(df, g2)
#> # A tibble: 5 × 4
#> g1 g2 a b
#> <dbl> <dbl> <int> <int>
#> 1 1 2 1 2
#> 2 1 1 4 5
#> 3 2 1 3 3
#> 4 2 1 5 1
#> 5 2 3 2 4
packageVersion("tidyverse")
#> [1] '1.3.1'
由 reprex package (v2.0.1)
创建于 2022-03-17
我正在尝试使用新的 quo 功能,同时使用 dplyr 和 运行 将函数编写到以下问题中:
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 3, 1),
a = sample(5),
b = sample(5)
)
通过变量运行获取数据框很简单:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(!!quo_arrange_var)
}
但是如果我想设置一个优惠顺序呢?例如,任何 ar运行ge 变量都将 2 作为顶部变量,然后正常排序。对于以前版本的 dplyr,我会使用:
arrange(-(arrange_var == 2), arrange_var)
但在新结构中我不确定如何处理。我试过:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-!!quo_arrange_var==2, !!quo_arrange_var)
}
但我收到错误
Error in arrange_impl(.data, dots) :
incorrect size (1) at position 1, expecting : 5
我也试过使用 quo_name:
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-!!(paste0(quo_name(quo_arrange_var), "==2")), !!quo_arrange_var)
}
但出现此错误:
Error in arrange_impl(.data, dots) :
Evaluation error: invalid argument to unary operator.
任何帮助将不胜感激
最简单的解决方法是在 bang-bang 两边加上括号。这与 !
和 ==
的运算符优先级有关。当你有 !!a==b
时,即使你想要 (!!a)==b
,它也会被解析为 !!(a==b)
。出于某种原因,您可以将 quosure 与数值 quo(a)==2
returns FALSE
进行比较,因此表达式的计算结果为 arrange(-FALSE, g2)
,这会给您相同的错误消息。
my_arrange <- function(df, arrange_var) {
quo_arrange_var <- enquo(arrange_var)
df %>%
arrange(-((!!quo_arrange_var)==2), !!quo_arrange_var)
}
my_arrange(df, g2)
# # A tibble: 5 x 4
# g1 g2 a b
# <dbl> <dbl> <int> <int>
# 1 1 2 5 4
# 2 1 1 2 5
# 3 2 1 4 3
# 4 2 1 3 1
# 5 2 3 1 2
tidyverse 已经进化,不再需要 enquo
。相反,我们将表达式括在双括号 {{ }}
中(也就是我们 embrace 它们)。
library("tidyverse")
df <- tibble(
g1 = c(1, 1, 2, 2, 2),
g2 = c(1, 2, 1, 3, 1),
a = sample(5),
b = sample(5)
)
my_arrange <- function(df, arrange_var) {
df %>%
arrange(desc({{ arrange_var }} == 2), {{ arrange_var }})
}
my_arrange(df, g2)
#> # A tibble: 5 × 4
#> g1 g2 a b
#> <dbl> <dbl> <int> <int>
#> 1 1 2 1 2
#> 2 1 1 4 5
#> 3 2 1 3 3
#> 4 2 1 5 1
#> 5 2 3 2 4
packageVersion("tidyverse")
#> [1] '1.3.1'
由 reprex package (v2.0.1)
创建于 2022-03-17