使用 by=c(x=y) 错误在函数内执行 dplyr::left_join

Posted

技术标签:

【中文标题】使用 by=c(x=y) 错误在函数内执行 dplyr::left_join【英文标题】:Executing dplyr::left_join within a function using by=c(x=y) error 【发布时间】:2020-01-30 12:57:29 【问题描述】:

我正在尝试围绕 dplyr::left_join 编写一个函数,以简化我需要执行多次的重复过程。

考虑以下代码:

    testdf <- data.frame(X1 = c("A", "B", "C"), X2 = c(1,2,3))

    testdf2 <- data.frame(Y1 = c("a", "b", "c"), Y2 = c(1,2,3))

    testdf3 <- dplyr::left_join(testdf, testdf2, by=c("X2" = "Y2"))

这种方法有效,因为 testdf3 将是一个由 X1、X2 和 Y1 组成的数据框。 现在,考虑以下函数:

    test_function <- function(df1, df2, col1, col2)

        output_dataframe <- dplyr::join(df1, df2, by=(col1 = col2))

        return(output_dataframe)

    

    output1 <- test_function(testdf, testdf2, "X2", "Y2")

此代码向我抛出以下错误:

“错误:by 不能包含 LHS 中缺少的连接列 col1

这可能是一件小事,因为在我看来它不会正确地将列名变量复制到 left_join 函数中,但我已经为这个问题苦苦挣扎了很长一段时间了。

我尝试了以下方法:

    test_function <- function(df1, df2, col1, col2)

        helper <- c(col1 = col2)

        output_dataframe <- dplyr::join(df1, df2, by=helper)

        return(output_dataframe)

    

但是,错误是相同的,我不知道如何解决这个问题。

我需要一个函数来压缩我需要重复执行的几个步骤,因此在另一个函数中执行 left_join 将帮助我保持代码的清洁和可读性。有谁知道如何解决这个问题?

【问题讨论】:

您查看这些答案了吗? ***.com/questions/53101245/… 或 ***.com/questions/48449799/… 谢谢,我一开始没有找到这些。似乎 dplyr 在这里需要引用的参数,可以使用 enquo() 函数提供。 【参考方案1】:

我认为这与评估有关(见此处:https://adv-r.hadley.nz/evaluation.html 也许不是...

我找到了一种 hacky 方式,但它对我有用:

test_function <- function(df1, df2, col1, col2)

   helper <- col2
   names(helper) <- col1

   output_dataframe <- dplyr::left_join(df1, df2, by=helper)

   return(output_dataframe)


【讨论】:

非常感谢!这种方法确实有效。我不完全理解为什么以“by = c(X,Y)”的形式分配变量不起作用,但有了这些信息,我可以继续我的工作。 尝试c(a=1)c("a"=1),并查看结果输出。你会看到它是一样的,这就是为什么 c(col1=col2) 在函数调用中不起作用。

以上是关于使用 by=c(x=y) 错误在函数内执行 dplyr::left_join的主要内容,如果未能解决你的问题,请参考以下文章

R语言数据表匹配和拼接-merge函数

函数积累

r语言 merge函数by.x啥意思

尝试将脚本作为函数执行

Step By Step(Lua函数)

Step By Step(Lua函数)