代码之家  ›  专栏  ›  技术社区  ›  Peter Chen

dplyr包中带有mutate_at()的警告消息

  •  1
  • Peter Chen  · 技术社区  · 5 年前

    使用时收到警告信息 mutate_at() 在里面 dplyr 包裹。

    dt %>% 
      mutate_at(
        c(5:43),
        funs(pc = ./Population)
        )
    
    Warning message:
    funs() is soft deprecated as of dplyr 0.8.0
    Please use a list of either functions or lambdas: 
    
      # Simple named list: 
      list(mean = mean, median = median)
    
      # Auto named with `tibble::lst()`: 
      tibble::lst(mean, median)
    
      # Using lambdas
      list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
    This warning is displayed once per session. 
    

    有其他功能吗?
    data.table .

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

    最新版本的 dplyr ,可能是 list

    library(dplyr)
    dt %>% 
      mutate_at(5:43,
             list(pc = ~ ./Population))
    

    可复制示例

    head(mtcars) %>%
           mutate_at(4:5, list(pc = ~ ./wt))
    #    mpg cyl disp  hp drat    wt  qsec vs am gear carb    hp_pc   drat_pc
    #1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4 41.98473 1.4885496
    #2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4 38.26087 1.3565217
    #3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1 40.08621 1.6594828
    #4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1 34.21462 0.9580093
    #5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 50.87209 0.9156977
    #6 18.1   6  225 105 2.76 3.460 20.22  1  0    3    1 30.34682 0.7976879
    

    警告消息是友好的警告,无需担心


    data.table ,我们在 .SDcols

    library(data.table)
    setDT(dt)[, paste0(names(dt)[5:43], "_pc") := 
               lapply(.SD, function(x) x/Population), .SDcols = 5:43]
    

    base R

    nm1 <- names(dt)[5:43]
    dt[paste0(nm1, "_pc")] <- lapply(dt[nm1], `/`, dt[["Population"]])
    

    或者直接

    dt[paste0(nm1, "_pc")] <- dt[nm1]/dt[["Population"]]