代码之家  ›  专栏  ›  技术社区  ›  Konrad

在dplyr的left_join中使用as_label/as_name而不是quo_name连接两个数据集

  •  0
  • Konrad  · 技术社区  · 4 年前

    根据答案 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()只适用于(可能是封闭的)符号,但它是一个很好的 定义和确定性操作。

    例子

    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
    )
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   akrun    4 年前

    一个选项是转换为 sym bol,然后用string 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