【问题标题】:how to pass a named vector or two vectors as arguments to dplyr::recode如何将命名向量或两个向量作为参数传递给 dplyr::recode
【发布时间】:2017-12-23 05:11:33
【问题描述】:

我想将一个命名向量或两个向量传递给 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,但如果有人能成功,那就太好了。

谢谢。

【问题讨论】:

    标签: r dplyr recode


    【解决方案1】:

    我们可以在base 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"   
    

    【讨论】:

    • @Sotos 我猜是。确认,是(使用dplyr_0.7.0
    • 我对类似于 baseR 的答案风格有点困惑
    • @Sotos 我认为应该有一种方法可以使用purrr 使用map
    • 非常有帮助,非常感谢。我需要为小标题中的列执行此操作。我花了一段时间才解决,可能是因为我有点昏暗,但这有效:- xt &lt;- 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)))
    • 即使这个问题已经很老了:你可以使用 !!!操作员。所以这是最短的重新编码调用:recode(x, !!!setNames(recode_tbl$fruit, recode_tbl$letter))
    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2012-03-03
    • 2022-01-17
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    相关资源
    最近更新 更多