在 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))

没有:==,:<

我们需要转换为 symbol 并计算 (!!)。此外,最好 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

其他几个选项是:

  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
  1. get :
dat %>%
  ungroup %>%
  mutate(!!paste0("test_", i) := 
           case_when(get(paste0("x_", i)) < get(paste0("x_", 2)) ~ 1,
                     TRUE ~ 0))