在 R 中使用比较运算符强制命名(dplyr、rlang、tidy)
Forcing names with comparison operators in R (dplyr, rlang, tidy)
当我在 LHS 上有一个强制表达式名称时,:=
的等价物可以用来代替 ==
和 <
等?
library(dplyr)
library(tibble)
i <- 1
dat <- tibble(n = 1:5) %>%
rowwise() %>%
mutate(!! paste0("x_", i) := rbinom(1, 1, .5),
x_2 = 1)
dat %>%
mutate(!! paste0("test_", i) := case_when(!! paste0("x_", i) < !! paste0("x_", 2) ~ 1, TRUE ~ 0))
dat %>%
mutate(!! paste0("test_", i+1) := case_when(!! paste0("x_", i) == !! paste0("x_", 2) ~ 1, TRUE ~ 0))
没有:==,:<
我们需要转换为 sym
bol 并计算 (!!
)。此外,最好 ungroup
在进行比较之前删除 rowwise
属性
library(dplyr)
dat %>%
ungroup %>%
mutate(!! paste0("test_", i) :=
case_when(!! rlang::sym(paste0("x_", i)) <
!! rlang::sym(paste0("x_", 2)) ~ 1,
TRUE ~ 0))
-输出
# A tibble: 5 x 4
# n x_1 x_2 test_1
# <int> <int> <dbl> <dbl>
#1 1 1 1 0
#2 2 0 1 1
#3 3 0 1 1
#4 4 1 1 0
#5 5 0 1 1
其他几个选项是:
.data
:
library(dplyr)
dat %>%
ungroup %>%
mutate(!!paste0("test_", i) :=
case_when(.data[[paste0("x_", i)]] < .data[[paste0("x_", 2)]] ~ 1,
TRUE ~ 0))
# n x_1 x_2 test_1
# <int> <int> <dbl> <dbl>
#1 1 1 1 0
#2 2 0 1 1
#3 3 1 1 0
#4 4 1 1 0
#5 5 1 1 0
get
:
dat %>%
ungroup %>%
mutate(!!paste0("test_", i) :=
case_when(get(paste0("x_", i)) < get(paste0("x_", 2)) ~ 1,
TRUE ~ 0))
当我在 LHS 上有一个强制表达式名称时,:=
的等价物可以用来代替 ==
和 <
等?
library(dplyr)
library(tibble)
i <- 1
dat <- tibble(n = 1:5) %>%
rowwise() %>%
mutate(!! paste0("x_", i) := rbinom(1, 1, .5),
x_2 = 1)
dat %>%
mutate(!! paste0("test_", i) := case_when(!! paste0("x_", i) < !! paste0("x_", 2) ~ 1, TRUE ~ 0))
dat %>%
mutate(!! paste0("test_", i+1) := case_when(!! paste0("x_", i) == !! paste0("x_", 2) ~ 1, TRUE ~ 0))
没有:==,:<
我们需要转换为 sym
bol 并计算 (!!
)。此外,最好 ungroup
在进行比较之前删除 rowwise
属性
library(dplyr)
dat %>%
ungroup %>%
mutate(!! paste0("test_", i) :=
case_when(!! rlang::sym(paste0("x_", i)) <
!! rlang::sym(paste0("x_", 2)) ~ 1,
TRUE ~ 0))
-输出
# A tibble: 5 x 4
# n x_1 x_2 test_1
# <int> <int> <dbl> <dbl>
#1 1 1 1 0
#2 2 0 1 1
#3 3 0 1 1
#4 4 1 1 0
#5 5 0 1 1
其他几个选项是:
.data
:
library(dplyr)
dat %>%
ungroup %>%
mutate(!!paste0("test_", i) :=
case_when(.data[[paste0("x_", i)]] < .data[[paste0("x_", 2)]] ~ 1,
TRUE ~ 0))
# n x_1 x_2 test_1
# <int> <int> <dbl> <dbl>
#1 1 1 1 0
#2 2 0 1 1
#3 3 1 1 0
#4 4 1 1 0
#5 5 1 1 0
get
:
dat %>%
ungroup %>%
mutate(!!paste0("test_", i) :=
case_when(get(paste0("x_", i)) < get(paste0("x_", 2)) ~ 1,
TRUE ~ 0))