【问题标题】:Passing variable names to the left side of the mutate() function in dplyr 1.0.0 [duplicate]将变量名称传递到 dplyr 1.0.0 中 mutate() 函数的左侧 [重复]
【发布时间】:2021-08-25 00:18:45
【问题描述】:

我想知道如何在新的dplyr 1.0.0 中使用 mutate() 转换函数内的现有变量,但我在函数的左侧遇到了问题。这是我的问题

library(dplyr)
library(forcats)

# toy data
df <- tibble(d_1_a = factor(c(letters[1:5],NA,NA)),
             d_1_b = factor(c(NA,NA,letters[1:5])))

现在,使用新的dplyr 编程语法.data[[foo]],我可以创建一个函数,将现有列变为新列,在本例中将fct_explicit_na 函数应用于列。

muteFunct <- function(d, i) {
  d %>% mutate(newFact = forcats::fct_explicit_na(.data[[i]]))
}

muteFunct(df, "d_1_a")

# output
#   d_1_a d_1_b newFact  
#   <fct> <fct> <fct>    
# 1 a     NA    a        
# 2 b     NA    b        
# 3 c     a     c        
# 4 d     b     d        
# 5 e     c     e        
# 6 NA    d     (Missing)
# 7 NA    e     (Missing)

效果很好。请注意带有显式 NA 的新列。但是,如果我想转换 existing 列,左侧也需要通过函数传入的参数这一事实会导致问题(无论如何都会导致 me 问题)。我已经尝试了几种方法,但这是一种尝试,使用 !! 运算符

muteFunct2 <- function(d, i) {
  d %>% mutate(!!.data[[i]] := forcats::fct_explicit_na(.data[[i]]))
}

muteFunct2(df, "d_1_a")

这会生成以下错误消息

Error: The LHS of `:=` must be a string or a symbol
Run `rlang::last_error()` to see where the error occurred. 

谁能帮帮我?

注意:我知道有更好的方法可以在 dplyr 中实现特定结果(显式 NA),而无需创建定制函数,但是,此特定示例仅用于说明目的。我一般更感兴趣的是如何将参数传递到= 登录mutate() 的左侧

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    lhs 中,我们可以传递字符串并进行赋值(:=)。由于i 传递的是列名,所以只需执行!! i :=

    muteFunct2 <- function(d, i) {
       d %>%
         mutate(!! i:= forcats::fct_explicit_na(.data[[i]]))
     }
    

    -测试

    muteFunct2(df, "d_1_a")
    # A tibble: 7 x 2
      d_1_a     d_1_b
      <fct>     <fct>
    1 a         <NA> 
    2 b         <NA> 
    3 c         a    
    4 d         b    
    5 e         c    
    6 (Missing) d    
    7 (Missing) e    
    

    为了更新现有的列,我们也可以使用across。优点是它也可以占用一列以上

    muteFunct2 <- function(d, i) {
       d %>%
         mutate(across(all_of(i),  ~ forcats::fct_explicit_na(.)))
     }
    

    -测试

    muteFunct2(df, "d_1_a")
    muteFunct2(df, names(df))
    # A tibble: 7 x 2
      d_1_a     d_1_b    
      <fct>     <fct>    
    1 a         (Missing)
    2 b         (Missing)
    3 c         a        
    4 d         b        
    5 e         c        
    6 (Missing) d        
    7 (Missing) e       
    

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 2014-12-17
      • 2017-07-21
      相关资源
      最近更新 更多