如何用dplyr引用变量而不是列

时间:2017-12-05 17:37:14

标签: r dplyr

当使用dplyr:filter时,我经常计算一个包含可行选择的局部变量:

@echo off
setlocal
:positive
:squareroot
set b=3
set a=4
set c=5

set  "M=%%B%%*%%B%%-4*%%A%%*%%C%%" 
call set /a number=%M%
set /a last=2, sqrt=number/last 

:next
set /a last=(last+sqrt)/2, sqrt=number/last
if %sqrt% lss %last% goto next
set /a Q=(-%B%+%last%)/2*%A%
set /a R=(-%B%-%last%)/2*%A%
echo ----------------------------------------------------
echo The first solution is ~%Q%~ and the second is ~%R%~ !
echo ----------------------------------------------------
pause
goto start

但是,如果数据集偶然有一个具有相同名称的列,则无法实现预期目的:

df <- as_tibble(data.frame(id=c("a","b"), val=1:6))
ids <- c("b","c")
filter(df, id %in% ids)
# giving id %in% c("b","c")

我应该如何明确引用ids变量而不是ids列?

1 个答案:

答案 0 :(得分:7)

取消引用!!以告诉filter查看调用环境而不是数据框:

library(tidyverse)

df <- data_frame(id = rep(c("a","b"), 3), val = 1:6)
ids <- c("b", "c")

df %>% filter(id %in% ids)
#> # A tibble: 3 x 2
#>      id   val
#>   <chr> <int>
#> 1     b     2
#> 2     b     4
#> 3     b     6

df <- df %>% mutate(ids = "a")

df %>% filter(id %in% ids)
#> # A tibble: 3 x 3
#>      id   val   ids
#>   <chr> <int> <chr>
#> 1     a     1     a
#> 2     a     3     a
#> 3     a     5     a

df %>% filter(id %in% !!ids)
#> # A tibble: 3 x 3
#>      id   val   ids
#>   <chr> <int> <chr>
#> 1     b     2     a
#> 2     b     4     a
#> 3     b     6     a

当然,避免此类问题的更好方法是不要在您的全球环境中放置具有相同名称的矢量。