gpt4 book ai didi

r - 访问 `mutate_at` 中的列名以将其用于子集列表

转载 作者:行者123 更新时间:2023-12-04 04:12:15 29 4
gpt4 key购买 nike

我正在尝试重新编码几个变量,但使用不同的重新编码方案。重新编码方案保存在一个列表中,其中每个元素都是 old = new 形式的命名向量。每个元素是数据框中每个变量的重新编码方案

我正在使用 mutate_at 函数和 recode

我认为问题在于我无法提取变量名以使用它从列表中获取正确的重新编码方案

我尝试了 deparse(substitute(.)),如 here还有this没有帮助

我还看到了here我可以提取通过 tidyevalution 传递的变量的列名,但我再次未能实现它。 (它还使用了已弃用的“funs”)

最后,我希望这是重新编码变量的正确方法(即在 mutate 中使用这个重新编码列表)。如果有完全不同的方法来处理这种多重重新编码,请告诉我

library(dplyr)
# dplyr version 0.8.5

df <-
tibble(
var1 = c("A", "A", "B", "C"),
var2 = c("X", "Y", "Z", "Z")
)

recode_list <-
list(

var1 = c(A = 1, B = 2, C = 3),
var2 = c(X = 0, Y = -1, Z = 1)
)

recode_list
#> $var1
#> A B C
#> 1 2 3
#>
#> $var2
#> X Y Z
#> 0 -1 1

我正在使用 dplyr::recode 函数。


# recoding works fine when doing it one variable as a time
df %>%
mutate(
var1 = recode(var1, !!!recode_list[["var1"]]),
var2 = recode(var2, !!!recode_list[["var2"]])
)
#> # A tibble: 4 x 2
#> var1 var2
#> <dbl> <dbl>
#> 1 1 0
#> 2 1 -1
#> 3 2 1
#> 4 3 1

当我尝试应用一个函数对所有变量执行此操作时,它似乎失败了

# this does not work.
df %>%
mutate_at(vars(var1, var2), ~{

var_name <- rlang::quo_name(quo(.))

recode(., !!!recode_list[[var_name]])
}
)
#> Error in expr_interp(f): object 'var_name' not found

我还尝试了 rlang::as_namerlang::as_label 但我认为我无法真正将变量的名称捕获为字符串以使用它来子集重新编码列表


df %>%
mutate_at(vars(var1, var2), ~ {
var_name <- rlang::as_name(quo(.))
print(var_name)
#recode(., !!!recode_list[["var2"]])
}
)
#> [1] "."
#> [1] "."
#> # A tibble: 4 x 2
#> var1 var2
#> <chr> <chr>
#> 1 . .
#> 2 . .
#> 3 . .
#> 4 . .


Created on 2020-04-30 by the reprex package (v0.3.0)

最佳答案

这对你有用吗?

library(dplyr)
library(rlang)
df %>%
mutate_at(vars(var1,var2),
.funs = function(x){recode_list %<>% .[[as_label(enquo(x))]]
recode(x,!!!recode_list)})
## A tibble: 4 x 2
# var1 var2
# <dbl> <dbl>
#1 1 0
#2 1 -1
#3 2 1
#4 3 1

我怀疑这在放置子集 recode_list 时有效直接进入recode不是因为enquo延迟评估 x直到赋值给 %<>% .然后 !!!可以在之前正确评估后强制评估。

编辑

您使用 rlang 的方法也适用于一些修改:

library(rlang)
df %>%
mutate_at(vars(var1, var2), function(x) {
var_name <- rlang::as_label(substitute(x))
recode(x, !!!recode_list[[var_name]])
})

关于r - 访问 `mutate_at` 中的列名以将其用于子集列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61523202/

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