代码之家  ›  专栏  ›  技术社区  ›  Juan C

在mutate_at/mutate_all/mutate_if中引用固定列

  •  0
  • Juan C  · 技术社区  · 5 年前

    "#NA#" age 列大于14,我要转换 进入之内 999 ,因此我的数据框如下所示:

    age   var1     var2      num_var
    20    "#NA#"  "hello"    35
    30    "bye"  "#NA#"      32
    10    "hi"  "#NA#"       35
    

    age   var1     var2      num_var
    20    999  "hello"     35
    30    "bye"  999       32
    10    "hi"   "#NA#"    35
    

    (也可以是“999”而不是999)

    replace_NA <- function(x){
      if_else(x=="#NA#" & age>14, 999, x)}
    
    df %>%  mutate_if(is.character, replace_NA))
    

    object 'age' not found 错误。在这种情况下能做些什么?

    谢谢

    1 回复  |  直到 5 年前
        1
  •  1
  •   akrun    5 年前

    我们可以将函数更改为使用“age”作为输入参数。此外,更改“是”以返回字符元素,而不是数字元素,即。 "999" if_else 是特定于类型的,与 ifelse

    replace_NA <- function(x, age){
      if_else(x=="#NA#" & {{age}}>14, "999", x)
    }
    

    并将其测试为

    library(dplyr)
    df %>% 
        mutate(across(where(is.character), replace_NA, age = age))
    

    -输出

       age var1  var2 num_var
    1  20  999 hello      35
    2  30  bye   999      32
    3  10   hi  #NA#      35
    

    df <- structure(list(age = c(20L, 30L, 10L), var1 = c("#NA#", "bye", 
    "hi"), var2 = c("hello", "#NA#", "#NA#"), num_var = c(35L, 32L, 
    35L)), class = "data.frame", row.names = c(NA, -3L))
    
    推荐文章