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