dplyr :: _ join函数的命名向量“ by”参数

如何解决dplyr :: _ join函数的命名向量“ by”参数

我正在向两个dplyr::_join个不同数据列的by一个函数,并且第一个数据帧的列名被动态指定为函数参数。我相信我需要使用rlang准引用/元编程,但无法获得有效的解决方案。我感谢任何建议!

library(dplyr)
library(rlang)
library(palmerpenguins)

# Create a smaller dataset
penguins <-
  penguins %>% 
  group_by(species) %>% 
  slice_head(n = 4) %>% 
  ungroup()

# Create a colors dataset
penguin_colors <-
  tibble(
    type = c("Adelie","Chinstrap","Gentoo"),color = c("orange","purple","green")
  )


# Without function --------------------------------------------------------

# Join works with character vectors
left_join(
  penguins,penguin_colors,by = c("species" = "type")
)
#> # A tibble: 12 x 9
#>    species island bill_length_mm bill_depth_mm flipper_length_… body_mass_g
#>    <chr>   <fct>           <dbl>         <dbl>            <int>       <int>
#>  1 Adelie  Torge…           39.1          18.7              181        3750
#>  2 Adelie  Torge…           39.5          17.4              186        3800
#>  3 Adelie  Torge…           40.3          18                195        3250
#>  4 Adelie  Torge…           NA            NA                 NA          NA
#>  5 Chinst… Dream            46.5          17.9              192        3500
#>  6 Chinst… Dream            50            19.5              196        3900
#>  7 Chinst… Dream            51.3          19.2              193        3650
#>  8 Chinst… Dream            45.4          18.7              188        3525
#>  9 Gentoo  Biscoe           46.1          13.2              211        4500
#> 10 Gentoo  Biscoe           50            16.3              230        5700
#> 11 Gentoo  Biscoe           48.7          14.1              210        4450
#> 12 Gentoo  Biscoe           50            15.2              218        5700
#> # … with 3 more variables: sex <fct>,year <int>,color <chr>

# Join works with data-variable and character vector
left_join(
  penguins,by = c(species = "type")
)
#> # A tibble: 12 x 9
#>    species island bill_length_mm bill_depth_mm flipper_length_… body_mass_g
#>    <chr>   <fct>           <dbl>         <dbl>            <int>       <int>
#>  1 Adelie  Torge…           39.1          18.7              181        3750
#>  2 Adelie  Torge…           39.5          17.4              186        3800
#>  3 Adelie  Torge…           40.3          18                195        3250
#>  4 Adelie  Torge…           NA            NA                 NA          NA
#>  5 Chinst… Dream            46.5          17.9              192        3500
#>  6 Chinst… Dream            50            19.5              196        3900
#>  7 Chinst… Dream            51.3          19.2              193        3650
#>  8 Chinst… Dream            45.4          18.7              188        3525
#>  9 Gentoo  Biscoe           46.1          13.2              211        4500
#> 10 Gentoo  Biscoe           50            16.3              230        5700
#> 11 Gentoo  Biscoe           48.7          14.1              210        4450
#> 12 Gentoo  Biscoe           50            15.2              218        5700
#> # … with 3 more variables: sex <fct>,color <chr>

# Join does NOT work with character vector and data-variable
left_join(
  penguins,by = c(species = type)
)
#> Error in standardise_join_by(by,x_names = x_names,y_names = y_names): object 'type' not found



# With function -----------------------------------------------------------

# Version 1: Without tunneling
add_colors <- function(data,var) {
  left_join(
    data,by = c(var = "type")
  )
}

add_colors(penguins,species)
#> Error: Join columns must be present in data.
#> x Problem with `var`.
add_colors(penguins,"species")
#> Error: Join columns must be present in data.
#> x Problem with `var`.

# Version 2: With tunneling
add_colors <- function(data,by = c("{{var}}" = "type")
  )
}

add_colors(penguins,species)
#> Error: Join columns must be present in data.
#> x Problem with `{{var}}`.
add_colors(penguins,"species")
#> Error: Join columns must be present in data.
#> x Problem with `{{var}}`.

# Version 2: With tunneling and glue Syntax
add_colors <- function(data,by = c("{{var}}" := "type")
  )
}

add_colors(penguins,species)
#> Error: `:=` can only be used within a quasiquoted argument
add_colors(penguins,"species")
#> Error: `:=` can only be used within a quasiquoted argument

reprex package(v0.3.0)于2020-10-05创建

以下是我咨询过的相关资源:

谢谢您的建议。

解决方法

library(dplyr)
left_join(
  penguins,penguin_colors,by = c(species = "type")
)

上述方法之所以有效,是因为在by中,我们正在创建这样的命名向量:

c(species = "type")
#species 
# "type"

您也可以通过setNames来做到这一点:

setNames('type','species')

但是请注意,传递不带引号的species会失败。

setNames('type',species)

setNames(“ type”,种)中的错误:找不到对象'species'

因此,用setNames创建一个命名向量,并在函数中传递字符值。

add_colors <- function(data,var) {
  left_join(
    data,by = setNames('type',var)
  )
}

add_colors(penguins,'species')
,

要添加到Ronak的解决方案中,您也可以使用ensym

而无需引号

示例:

add_colors <- function(data,var) {

    left_join(
        data,by = set_names("type",nm = ensym(var))
    )
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?