dplyr::select 的评估在我的函数中不起作用

Evaluation with dplyr::select does not work in my function

我对处理 R 中的评估问题真的很陌生。

example<- data.frame(id = 1:5,
                 pairs0 = c(1, 1, 1, 2, 2),
                 pairs1 = c(2, 2, 1, 1, 1)
                     )

这是我要编写的函数:

f <- function(df, col_pair){
       
       df2 <- df %>% mutate(j = row_number())

full_join(df2 %>% select(j, col_pair),
          df2 %>% select(j, col_pair),
          suffix = c('1', '2'),
          by = "{{col_pair}}",
          keep = TRUE) %>%
filter(j1 != j2)
}

该函数选择一个数据框 df 并按列 col_pair 将其连接到自身。 问题是,如果我 运行 f(example, pairs0),我会得到“连接列必须存在于数据中”

有人可以帮忙吗?

我已经对你的函数做了修改,你可以看到一个选项,因为它使用带引号的变量,并且它可以像使用其他评估方案那样麻烦。这里的代码:

#Function
f <- function(df, col_pair){
  
  df2 <- df %>% mutate(j = row_number())
  
  full_join(df2 %>% select(j, col_pair),
            df2 %>% select(j, col_pair),
            suffix = c('1', '2'),
            by = col_pair,
            keep = TRUE) %>%
    filter(j1 != j2)
}
#Apply
f(example, 'pairs0')

输出:

  j1 pairs01 j2 pairs02
1  1       1  2       1
2  1       1  3       1
3  2       1  1       1
4  2       1  3       1
5  3       1  1       1
6  3       1  2       1
7  4       2  5       2
8  5       2  4       2

此外,如果需要非标准评估,您可以使用此:

#Option 2
f <- function(df, col_pair){
  
  var <- enquo(col_pair)
  
  df2 <- df %>% mutate(j = row_number())
  
  full_join(df2 %>% select(j, !!var),
            df2 %>% select(j, !!var),
            suffix = c('1', '2'),
            by = rlang::as_name(var),
            keep = TRUE) %>%
    filter(j1 != j2)
}

我们申请:

#Apply
f(example, pairs0)

输出:

  j1 pairs01 j2 pairs02
1  1       1  2       1
2  1       1  3       1
3  2       1  1       1
4  2       1  3       1
5  3       1  1       1
6  3       1  2       1
7  4       2  5       2
8  5       2  4       2