конвейер dplyr в функции - PullRequest
2 голосов
/ 09 июля 2019

Я пытаюсь поместить конвейер dplyr в функцию, но после многократного чтения виньетки, а также оценки результата (https://tidyeval.tidyverse.org/dplyr.html). Я все еще не могу заставить его работать ...

#Sample data:
dat <- read.table(text = "A ID B
1   X   83
2   X   NA
3   X   NA
4   Y   NA
5   X   2
6   Y   2
12   Y   10
7   Y   18
8   Y   85", header = TRUE)

# What I'm trying to do:
x <- dat %>% filter(!is.na(B)) %>% count('ID') %>% filter(freq>3)
x$ID

# Now in a function:
n_occurences <- function(df, n, column){
  # Group by ID and return IDs with number of non-na > n in column
  column <- enquo(column)
  x <- df %>%
       filter(!is.na(!!column))  %>%
       count('ID') %>% filter(freq>n)
  x$ID
}

# Let's try:
col <- 'B'
n_occurences(dat, n=3, column = col)

Нет ошибки, но вывод неправильный. Это как-то связано с аккуратной оценкой, но я просто не могу разобраться с этим.

1 Ответ

3 голосов
/ 09 июля 2019

С помощью rlang_0.40 мы можем сделать это намного проще, используя {{...}} или оператор curly-curly

library(rlang)
library(dplyr)
n_occurences <- function(df, n1, column){

 df %>%
   filter(!is.na({{column}}))  %>%
    count(ID) %>% 
    filter(n > n1) %>%
    pull(ID)

 }     

n_occurences(dat, n1 = 3, column = B)
#[1] Y
#Levels: X Y

Если мы собираемся передать строку в кавычках, преобразовать ее в символ(sym), а затем выполните оценку (!!)

n_occurences <- function(df, n1, column){

  column <- rlang::sym(column)
 df %>%
       filter(!is.na(!!column))  %>%
       count(ID) %>% 
       filter(n > n1) %>%
       pull(ID)

}


col <- 'B'
n_occurences(dat, n1=3, column = col)
#[1] Y
#Levels: X Y
...