предупреждающее сообщение с mutate_at () в пакете dplyr - PullRequest
1 голос
/ 15 февраля 2020

Я получил предупреждение при использовании 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 Ответ

3 голосов
/ 15 февраля 2020

С последними версиями 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"]]
...