将 plyr::mapvalues 与 dplyr 一起使用

Using plyr::mapvalues with dplyr

plyr::mapvalues可以这样使用:

mapvalues(mtcars$cyl, c(4, 6, 8), c("a", "b", "c"))

但这不起作用:

mtcars %>%
dplyr::select(cyl) %>%
mapvalues(c(4, 6, 8), c("a", "b", "c")) %>%
as.data.frame()

如何将 plyr::mapvaluesdplyr 一起使用?或者更好的是,dplyr 等价物是什么?

2020 更新: plyr 现在是一个“退役”包,其官方指南建议改用积极改进和维护的 dplyr 包。所以最好只使用 dplyr,在这种情况下 dplyr::recode() 一样,完全避免使用 plyr。

要将 plyr::mapvalues() 与 dplyr 一起使用:

使用它和return单列data.frame:

mtcars %>%
  transmute(cyl = plyr::mapvalues(cyl, c(4, 6, 8), c("a", "b", "c")))

或者,如果您想要单个矢量输出,就像在您的工作示例中一样,请使用 pull:

mtcars %>%
  pull(cyl) %>%
  plyr::mapvalues(., c(4, 6, 8), c("a", "b", "c"))

如果您同时使用 dplyr 和 plyr,请参阅 dplyr readme 中的注释:

You'll need to be a little careful if you load both plyr and dplyr at the same time. I'd recommend loading plyr first, then dplyr, so that the faster dplyr functions come first in the search path. By and large, any function provided by both dplyr and plyr works in a similar way, although dplyr functions tend to be faster and more general.

不过请注意,如果加载了 dplyr 而无需加载 plyr,您可以使用 plyr::mapvalues 调用 mapvalues

因为问题也提到了

Or even better, what the dplyr equivalent?

等同于重新编码。

http://www.cookbook-r.com/Manipulating_data/Renaming_levels_of_a_factor/

name <- c("John", "Clara", "Smith")
sex <- c(1,2,1)
age <- c(30,32,54)
df <- data.frame(name,sex,age)
df %>% mutate(sex=recode(sex,
`1`="Male",
`2`="Female"))

这将 "mapvalues" 1 分给男性,2 分给女性。

我是一个重度 plyr::mapvalues() 用户。我用它来用新值替换字符串中的旧值。类似于:

set.seed(1)
data <- data.frame(name = sample(letters[1:5], 100, replace = TRUE))
check_list <- data.frame(old = letters[1:5], new = LETTERS[1:5])

data$name
#> [1] "a" "d" "a" "b" "e" "c" "b" "c" "c" "a" "e" "e" "b" "b"

plyr::mapvalues(data$name, check_list$old, check_list$new)
#> [1] "A" "D" "A" "B" "E" "C" "B" "C" "C" "A" "E" "E" "B" "B" ...

如果我错了,请纠正我,但是没有同样简洁的 dplyr 方法可以做到这一点。您仍然可以使用 dplyr::recode() 来完成它,但是:

dplyr::recode(data$name, !!!setNames(check_list$new, check_list$old))
#> [1] "A" "D" "A" "B" "E" "C" "B" "C" "C" "A" "E" "E" "B" "B" ...

正如the documentation中所说,命名向量的顺序是旧的(名称)=新的(值),这与dplyr::mutate()dplyr::rename()函数相反(写的时候,可能以后会修复)。

添加这个作为答案,因为当我忘记并且无法快速找到答案时,我一直在谷歌搜索如何做。也许现在我可以。方案修改自函数文档中Examples的最后两行