dplyr: NSE in joins (by)

2020-07-22 09:51发布

I had a hard time to figure out how I could join two tables using dplyr::left_join with NSE. The problem was that I could not supply the right value to 'by'. I think I have found a solution for now, but it feels like I am doing it in an extra complicated way. So, if you know an easier/more elegant solution, please let me know :)

That's what I am doing:

# some data
df <- dplyr::tibble(x=1:10,
                    y=LETTERS[1:10],
                    z=LETTERS[11:20])

# some function
test_fun <- function(df,id){
  id <- rlang::enquo(id)
  join_var <- names(rlang::quos_auto_name(id))[2] # is there an easier way?
  # not important: doing some stuff
  df1 <- df %>%
    dplyr::select(!!id,y)
  df2 <- df %>%
    dplyr::select(!!id,z)
  # join using prepared join_var
  df1 %>%
    dplyr::left_join(df2,setNames(join_var,join_var))
}

test_fun(df,id=x)

As I was asked for additional context and some more explaination to better understand my problem, I will try to give some more information here:

NSE is an abbreviation for non-standard evaluation. My goal was to build a function that joins to datasets based on a variable the user could define. The main problem was that the by-argument in dplyr::left_join did not accept the quoted variable (NSE argument) and so I had to find a workaround. The way I found (join_var <- names(rlang::quos_auto_name(id))[2]) seemd a little complicated and I was looking for an easier solution. That was - by the way - provided by Lionel Henry ... thanks :)

1条回答
ゆ 、 Hurt°
2楼-- · 2020-07-22 10:43

You're looking for join_var <- rlang::as_name(id).

查看更多
登录 后发表回答