如何将命名向量或两个向量作为参数传递给dplyr::recode函数

10

我希望能够将命名向量或两个向量传递给dplyr :: recode函数。

假设我有:

library(dplyr)
set.seed(1)
x <- c("customer", sample(c("a", "b", "c"), 10, replace = TRUE))
recode_tbl <- tibble(letter = letters[1:3], fruit = c("apple", "banana", "cranberry"))

我想做的是使用recode_tbl的列来对x进行重新编码,而不需要手动指定成对的内容,例如:
recode(x, a = "apple", b = "banana", c = "cranberry")

以下是一个示例:

recode(x, as.name(recode_tbl$letter) = recode_tbl$fruit)

显然那样做行不通。我不反对尝试 NSE,如果有人能开始推进,那就太好了。

谢谢。

1个回答

8
我们可以使用基本的R语言实现这个功能。
x1 <- unname(setNames(recode_tbl$fruit, recode_tbl$letter)[x])
x1[is.na(x1)] <- x[is.na(x1)]

或者使用do.callrecode一起使用。
do.call(dplyr::recode, c(list(x), setNames(recode_tbl$fruit, recode_tbl$letter)))
#[1] "customer"  "apple"     "banana"    "banana"    "cranberry" "apple"
#[8] "cranberry" "cranberry" "banana"    "banana"    "apple"   

1
我对回答中类似于baseR风格的语法有些困惑。 - Sotos
1
@Sotos 我认为可以使用 purrr 中的 map 方法来实现。 - akrun
1
非常有帮助,十分感谢。我需要在tibble的列中这样做。我花了一些时间才想出来,可能是因为我有点迟钝,但这个方法可行:xt <- tibble(Customer = sample(c("a", "b", "c"), 20, replace = TRUE))do.call(dplyr::recode, c(list(xt$Customer), setNames(recode_tbl$fruit, recode_tbl$letter))) - astaines
1
好的,我想通了 - 它是 mutate(variable = recode(variable, !!!namedlist)。 - Arthur Yip
3
尽管这个问题已经很老了:您可以使用 !!! 运算符绕过 do.call。因此,这是使用 recode 的最短调用:recode(x, !!!setNames(recode_tbl$fruit, recode_tbl$letter)) - Reinhold Kainhofer
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接