Filter by variable column name


#1

How can I use filter with a variable column name?

df <- tibble(
g1 = c(1, 1, 2, 2, 2, NA),
g2 = c(1, 2, 1, 2, 1, NA),
a = sample(6), 
b = sample(6)
)

name. <- "g1"

df %>%
  filter(!is.na(name.))

This is the result I am looking for:


df %>%
  filter(!is.na(get(name.)))

# A tibble: 5 x 4
     g1    g2     a     b
  <dbl> <dbl> <int> <int>
1  1.00  1.00     5     5
2  1.00  2.00     6     6
3  2.00  1.00     2     3
4  2.00  2.00     4     4
5  2.00  1.00     1     2

I would like to understand how to use the quo, enquo, and !! functions for this purpose.


#2

Hi, following webinar is a really useful resource on tidy eval.

You can achieve your result as follows:

library(tidyverse)
library(rlang)
df <- tibble(
  g1 = c(1, 1, 2, 2, 2, NA),
  g2 = c(1, 2, 1, 2, 1, NA),
  a = sample(6), 
  b = sample(6)
)

name. <- rlang::quo(g1)

df %>%
  filter(!is.na(!!name.))

#3

Thank you. In the example you gave, the column name is given as g1. I am looking for a solution where the column name is given as a string.


#4
library(tidyverse)
library(rlang)
df <- tibble(
  g1 = c(1, 1, 2, 2, 2, NA),
  g2 = c(1, 2, 1, 2, 1, NA),
  a = sample(6), 
  b = sample(6)
)

name. <- "g1"
name_sym <- rlang::sym(name.)

df %>%
  filter(!is.na(!!name_sym))

#5

Thank you very much for the help.