【问题标题】:Joining two data sets using as_label / as_name instead of quo_name within dplyr's left_join在 dplyr 的 left_join 中使用 as_label / as_name 而不是 quo_name 连接两个数据集
【发布时间】:2021-03-24 15:19:30
【问题描述】:

根据join datasets using a quosure as the by argument 上的答案建议使用:quo_name 以便使用 quosures 连接表;我想使用as_name / as_label 得到相同的结果,因为quo_name 目前处于质疑生命周期阶段

这些函数处于质疑生命周期阶段。

应该使用as_label()as_name() 而不是quo_name()。 as_label() 将任何 R 对象转换为字符串,但只能使用 创建一个默认名称。标签化不是一个定义明确的操作 并且不应对标签做出任何假设。另一方面, as_name() 仅适用于(可能是quosured)符号,但它是一个很好的 定义和确定性的操作。

示例

library("tidyverse")

data_a <- tibble(col_ltr = letters, col_nums = seq_along(letters))
data_b <- tibble(col_ltr = letters, col_nums = seq_along(letters) * -1)


clean_and_join <-
    function(data_one,
             data_two,
             column_id_one,
             column_id_two,
             col_nums_one,
             col_nums_two) {

        clean_data_one <- filter(data_one, {{col_nums_one}} %% 2 == 0)
        clean_data_two <- filter(data_two, {{col_nums_two}} %% 2 != 0)

        by_cols <- set_names(as_label({{column_id_one}}), as_label({{column_id_two}}))

        left_join(
            x = clean_data_one,
            y = clean_data_two,
            by = by_cols
        )
    }

clean_and_join(data_one = data_a, data_two = data_b, column_id_one = col_ltr,
               column_id_two = col_ltr, col_nums_one = col_nums,
               col_nums_two = col_nums)

错误

is_quosure(x) 中的错误:找不到对象 'col_ltr'

期望的结果

left_join(
    x = clean_data_one,
    y = clean_data_two,
    by = c("col_ltr" = "col_ltr") # Or by = "col_ltr" in case of identical name
)

【问题讨论】:

    标签: r dplyr left-join rlang quosure


    【解决方案1】:

    一个选项将转换为symbol,然后转换为带有as_string的字符串

    clean_and_join <-
        function(data_one,
                 data_two,
                 column_id_one,
                 column_id_two,
                 col_nums_one,
                 col_nums_two) {
    
            clean_data_one <- filter(data_one, {{col_nums_one}} %% 2 == 0)
            clean_data_two <- filter(data_two, {{col_nums_two}} %% 2 != 0)
    
            by_cols <- set_names(rlang::as_string(rlang::ensym(column_id_one)), 
                     rlang::as_string(rlang::ensym(column_id_two)))
    
            left_join(
                x = clean_data_one,
                y = clean_data_two,
                by = by_cols
            )
        }
      
    

    -测试

    clean_and_join(data_one = data_a, data_two = data_b, column_id_one = col_ltr,
                    column_id_two = col_ltr, col_nums_one = col_nums,
                    col_nums_two = col_nums)
    # A tibble: 13 x 3
       col_ltr col_nums.x col_nums.y
    #   <chr>        <int>      <dbl>
    # 1 b                2         NA
    # 2 d                4         NA
    # 3 f                6         NA
    # 4 h                8         NA
    # 5 j               10         NA
    # 6 l               12         NA
    # 7 n               14         NA
    # 8 p               16         NA
    # 9 r               18         NA
    #10 t               20         NA
    #11 v               22         NA
    #12 x               24         NA
    #13 z               26         NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 2021-04-19
      相关资源
      最近更新 更多