【问题标题】:Refering to column names inside dplyr's across()引用 dplyr cross() 中的列名
【发布时间】:2020-09-21 03:43:09
【问题描述】:

是否可以在 across() 内的 lambda 函数中引用列 names

df <- tibble(age = c(12, 45), sex = c('f', 'f'))
allowed_values <- list(age = 18:100, sex = c("f", "m"))

df %>%
  mutate(across(c(age, sex),
                c(valid = ~ .x %in% allowed_values[[COLNAME]])))

我刚刚遇到this question,其中 OP 询问基于允许值列表验证数据框中的列。

dplyr 刚刚获得了across(),这似乎是一个自然的选择,但我们需要列名来查找允许的值。

The best I could come up with 是对imap_dfr 的调用,但是集成到分析管道中比较麻烦,因为需要将结果与原始数据帧重新组合。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    我认为此时您可能对across 提出了太多要求(但这可能会刺激进一步的开发,因此也许有一天它会按照您的建议方式工作)。

    我认为 purrr 包中的 imap 函数现在可能会给你你想要的:

    > df <- tibble(age = c(12, 45), sex = c('f', 'f'))
    > allowed_values <- list(age = 18:100, sex = c("f", "m"))
    > 
    > df %>% imap( ~ .x %in% allowed_values[[.y]])
    $age
    [1] FALSE  TRUE
    
    $sex
    [1] TRUE TRUE
    
    > df %>% imap_dfc( ~ .x %in% allowed_values[[.y]])
    # A tibble: 2 x 2
      age   sex  
      <lgl> <lgl>
    1 FALSE TRUE 
    2 TRUE  TRUE 
    

    如果您想要一个具有组合有效性的列,那么您可以通过reduce 传递结果:

    > df %>% imap( ~ .x %in% allowed_values[[.y]]) %>%
    +   reduce(`&`)
    [1] FALSE  TRUE
    

    然后可以将其作为新列添加到原始数据中,或者仅用于对数据进行子集化。我对 tidyverse 还不够熟练,还不知道这是否可以与 mutate 结合使用以直接添加列。

    【讨论】:

      【解决方案2】:

      答案是肯定的,可以参考dplyracross中的列名。您需要使用cur_column()。你原来的答案是如此接近!将cur_column() 插入到您想要列名的解决方案中:

      library(tidyverse)
      
      df <- tibble(age = c(12, 45), sex = c('f', 'f'))
      allowed_values <- list(age = 18:100, sex = c("f", "m"))
      
      df %>%
        mutate(across(c(age, sex),
                      c(valid = ~ .x %in% allowed_values[[cur_column()]])
                      )
               )
      

      参考:https://dplyr.tidyverse.org/articles/colwise.html#current-column

      【讨论】:

        猜你喜欢
        • 2022-10-14
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 2021-09-21
        • 2021-01-24
        • 1970-01-01
        • 2020-10-14
        • 2021-04-09
        相关资源
        最近更新 更多