【问题标题】:dplyr `left_join()` does not work with a character objects as the LHS variable [duplicate]dplyr `left_join()` 不适用于作为 LHS 变量的字符对象 [重复]
【发布时间】:2019-07-16 08:33:42
【问题描述】:

我可以使用dplyr::left_join(..., by = c("name1" = "name2") 连接两个包含两个具有不同名称的变量的数据集。

我想使用角色对象加入,left_join(..., by = c(nameOb1 = nameOb2)。奇怪的是:这适用于by = c("name1", nameOb2)但不适用于by = c(nameOb1, "name2")

这是为什么?

在下面复制我的问题。非常感谢。

生成数据

    orig <- tibble(name1 = c("a", "b", "c"),
                   n     = c(10, 20, 30))  

    tojoin <- tibble(name2 = c("a", "b", "c"),
                     pc    = c(.4, .1, .2))    

作品:使用字符串作为by 参数

    left_join(orig, tojoin, by = c("name1" = "name2"))

    # A tibble: 3 x 3
      name1     n    pc
      <chr> <dbl> <dbl>
    1 a        10   0.4
    2 b        20   0.1
    3 c        30   0.2

不起作用:使用 object 作为 first by 参数的字符串

    firstname <- "name1"

    left_join(orig, tojoin, by = c(firstname = "name2"))

    # Error: `by` can't contain join column `firstname` which is missing from LHS
    # Call `rlang::last_error()` to see a backtrace

作品:使用object作为secondby参数的字符串

    secondname <- "name2"

    left_join(orig, tojoin, by = c("name1" = secondname))

    # A tibble: 3 x 3
      name1     n    pc
      <chr> <dbl> <dbl>
    1 a        10   0.4
    2 b        20   0.1
    3 c        30   0.2

包:

dplyr 0.8.0.1

【问题讨论】:

  • 我不确定,但我认为这与此有关:# Note that only the key from the LHS is kept。现在由于firstname 在 LHS 中不可用,您需要设计一些机制来匹配它。我的努力是徒劳的。
  • 不是您的问题的答案,而是一种解决方法:left_join(orig, tojoin, by = 'names&lt;-'("name2", firstname))

标签: r join dplyr left-join


【解决方案1】:

嘿,'left_join' 函数在 by 参数中需要一个命名字符向量。在您的第二次尝试中:

firstname <- "name1"
left_join(orig, tojoin, by = c(firstname = "name2"))

您将字符向量的名称设置为firstname,这对连接不起作用。 为了解决这个问题,您可以首先生成一个命名字符向量并将其传递给连接函数的 by 参数

firstname <- "name1"
join_cols = c("name2")
names(join_cols) <- firstname

dplyr::left_join(orig, tojoin, by = join_cols)

【讨论】:

  • 问题是为什么它不适用于firstname,但适用于secondname
  • 我第一句话就回答了这个问题!
  • 您设置了错误的字符向量。通过使用c(firstname = "name2") 初始化字符向量,向量条目的名称不是在变量firstname 中设置的字符串。在您的第二个示例中,您将变量 secondname 设置为整个向量,这意味着在字符向量中,该值是在您的 secondname 变量中设置的字符串。您使用字符串“name2”设置此条目的名称。希望你明白这一点。
  • 感谢@Freakazoid 的解决方案——它有效,我现在明白为什么了,
猜你喜欢
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
相关资源
最近更新 更多