Я бы подошел к этому так. Результат - это список матриц, которые можно использовать для дальнейшей перезаписи существующих столбцов или создания новых, либо использовать как автономный объект данных.
vars <- list(van = c("mpg", "cyl"),
tu = c("vs", "am"))
funk <- list(van = as.integer,
tu = as.logical)
mapply(FUN = function(v, f) {
sapply(mtcars[, v], FUN = f)
}, v = vars, f = funk, SIMPLIFY = FALSE)
$van
mpg cyl
[1,] 21 6
[2,] 21 6
[3,] 22 4
[4,] 21 6
[5,] 18 8
...
$tu
vs am
[1,] FALSE TRUE
[2,] FALSE TRUE
[3,] TRUE TRUE
[4,] TRUE FALSE
[5,] FALSE FALSE
...
Чтобы перезаписать существующие столбцы, вы можете использовать «ужасный» цикл for. :)
mtcars[colnames(out$van)] <- out$van
mtcars[colnames(out$tu)] <- out$tu
# in generalized form
for (i in seq_along(out)) {
mtcars[colnames(out[[i]])] <- out[[i]]
}
> head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21 6 160 110 3.90 2.620 16.46 FALSE TRUE 4 4
Mazda RX4 Wag 21 6 160 110 3.90 2.875 17.02 FALSE TRUE 4 4
Datsun 710 22 4 108 93 3.85 2.320 18.61 TRUE TRUE 4 1
Hornet 4 Drive 21 6 258 110 3.08 3.215 19.44 TRUE FALSE 3 1
Hornet Sportabout 18 8 360 175 3.15 3.440 17.02 FALSE FALSE 3 2
Valiant 18 6 225 105 2.76 3.460 20.22 TRUE FALSE 3 1
Или делать все в одну петлю (короче).
for (i in seq_along(vars)) {
cls <- vars[[i]]
f <- funk[[i]]
mtcars[, cls] <- sapply(mtcars[, cls], FUN = f)
}
> head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21 6 160 110 3.90 2.620 16.46 FALSE TRUE 4 4
Mazda RX4 Wag 21 6 160 110 3.90 2.875 17.02 FALSE TRUE 4 4
Datsun 710 22 4 108 93 3.85 2.320 18.61 TRUE TRUE 4 1
Hornet 4 Drive 21 6 258 110 3.08 3.215 19.44 TRUE FALSE 3 1
Hornet Sportabout 18 8 360 175 3.15 3.440 17.02 FALSE FALSE 3 2
Valiant 18 6 225 105 2.76 3.460 20.22 TRUE FALSE 3 1
person
Roman Luštrik
schedule
12.11.2019
mtcars
с этими изменениями (то есть без применения функцийmutate_at
), чтобы вы могли продолжить работу, например, с mpg & cyl и vs & am как целочисленные и логические значения соответственно? - person larsoevlisen   schedule 12.11.2019mutate_at
. - person mihagazvoda   schedule 12.11.2019mutate_at
- мне пришлось бы написать почти 20 таких операторов в моем реальном коде (это всего лишь пример). Надеюсь, я был ясен, иначе дайте мне знать. - person mihagazvoda   schedule 12.11.2019