函数中的dplyr管道 [英] dplyr pipeline in a function

查看:51
本文介绍了函数中的dplyr管道的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将dplyr管道放入函数中,但在多次读取小插图以及整齐的评估之后(

I'm trying to put a dplyr pipeline in a function but after reading the vignette multiple times as well as the tidy evaluation (https://tidyeval.tidyverse.org/dplyr.html). I still can't get it to work...

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

没有错误,但是输出错误.这与整洁的评估有关,但我实在无法解决.

There is no error, but the output is wrong. This as something to do with the tidy evaluation, but I just can't get my head around it.

推荐答案

使用 rlang_0.40 ,我们可以通过使用 {{...}} code>或curl-curly运算符

With rlang_0.40, we can do this much easier by using the {{...}} or curly-curly operator

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

这篇关于函数中的dplyr管道的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆