在dplyr 0.7.x中对Select使用否定

在dplyr 0.7.x中对Select使用否定,r,dplyr,rlang,R,Dplyr,Rlang,我正在尝试编写一个函数,该函数需要从结果数据帧中排除用户传递的变量。我还借此机会进一步了解新的dplyr语法 该函数的作用类似于数据帧的交叉连接。我想用它作为跨函数参数复制数据的干净方法 该功能的工作原理如下: crossjoin_df <- function(df1, df2, temp_col = ".k") { df1 <- df1 %>% mutate(!!temp_col := 1) df2 <- df2 %>% mutat

我正在尝试编写一个函数,该函数需要从结果数据帧中排除用户传递的变量。我还借此机会进一步了解新的dplyr语法

该函数的作用类似于数据帧的交叉连接。我想用它作为跨函数参数复制数据的干净方法

该功能的工作原理如下:

crossjoin_df <- function(df1, df2, temp_col = ".k") {
  df1 <- df1 %>% 
    mutate(!!temp_col :=  1)

  df2 <- df2 %>% 
    mutate(!!temp_col :=  1)

  out <- left_join(df1, df2, by = temp_col)

  # I'm trying to replace the next line
  out[,!names(out)==temp_col] 
} 

params <- data.frame(k = c(11,10),
                 n = c(27,26))

data <- data.frame(a = 1:3,
               b = 4:6)

crossjoin_df(params, data) # 6 row data set
工作,但这显然只是选择。我无法得到任何类似于:

out %>% select(!!temp_col)
out %>% select(-!!temp_col)
工作。

您可以使用的一个\u,然后使用-:


这也应该起作用:

out %>% select_(paste0("-",temp_col))

无论您是否想继续使用字符串,您都需要rlang,dplyr的后端包,它支持tidy eval,在这种情况下,您需要sym将字符串转换为quosure:

图书馆弹琴 参数112714 > 2 11 27 2 5 > 3 11 27 3 6 > 4 10 26 1 4 > 5 10 26 2 5 > 6 10 26 3 6 …或切换到完整的tidy eval,在这种情况下,您需要使用quo_name将一个quosure转换为一个名称:

交叉连接 > 1 11 27 1 4 > 2 11 27 2 5 > 3 11 27 3 6 > 4 10 26 1 4 > 5 10 26 2 5 > 6 10 26 3 6 或者,只需使用tidyr::crossing:

tidyr::crossingparams,数据 >k n a b > 1 11 27 1 4 > 2 11 27 2 5 > 3 11 27 3 6 > 4 10 26 1 4 > 5 10 26 2 5 > 6 10 26 3 6
由于temp_var是一个字符串,如果要使用!!取消引号,则需要使用rlang::sym将其转换为quosure!!,e、 g.输出%>%选择-!!谢谢,我的理解是我不能让temp_var是空的,因为我需要它在mutate语句的LHS上。不确定是否有更干净的方法。我希望能够坚持只使用dplyr。这肯定有效,但我不确定这是否符合quosure新语法/概念的精神。我的理解是,quosure的存在是为了增强以非标准评估风格使用dplyr编程的能力,即不推荐*动词。因此,我猜select和select辅助函数仍然是实现这一点的一种规范方法。如果您更喜欢使用quosure,@alistaire的评论应该是最好的选择。谢谢,但我认为dplyr正在远离*\uuVerbs。它们不会被维护或提出,但它们不会在几年内或永远从包中删除:。但是,是的,使用@Psidom的答案可能更好,我提到它是为了完整性。
crossjoin_df <- function(df1, df2, temp_col = ".k") {
  # `$`(df1, temp_col) <- 1
  df1 <- df1 %>% 
    mutate(!!temp_col :=  1)

  # `$`(df2, temp_col) <- 1
  df2 <- df2 %>% 
    mutate(!!temp_col :=  1)

  left_join(df1, df2, by = temp_col) %>% select(-one_of(temp_col))

} 

params <- data.frame(k = c(11,10),
                 n = c(27,26))

data <- data.frame(a = 1:3,
               b = 4:6)

crossjoin_df(params, data)

#   k  n a b
#1 11 27 1 4
#2 11 27 2 5
#3 11 27 3 6
#4 10 26 1 4
#5 10 26 2 5
#6 10 26 3 6
out %>% select_(paste0("-",temp_col))