as.logic() 到 c("vs", "am") -6ren">
gpt4 book ai didi

r - mutate_at 在具有不同功能的多组列上

转载 作者:行者123 更新时间:2023-12-02 09:05:36 26 4
gpt4 key购买 nike

我定义了必须应用于不同数据框列集的函数。例如,mtcars 我想将 as.integer() 函数应用于列 c("mpg", "cyl") >as.logic()c("vs", "am")

library(dplyr)

mtcars %>%
mutate_at(c("mpg", "cyl"), as.integer) %>%
mutate_at(c("vs", "am"), as.logical)

最好使用 tidyverse 的做法是什么,用相应的函数保存此列集并应用它们,而无需多次使用 mutate_at

最佳答案

这就是我处理它的方式。结果是一个矩阵列表,可用于进一步覆盖现有列或创建新列或用作独立数据对象。

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

关于r - mutate_at 在具有不同功能的多组列上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58813018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com