繁体   English   中英

将 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 plyr::mapvalues使用? 或者更好的是, dplyr相当于什么?

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

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

要使用它并返回一列 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 自述文件中的此注释:

如果您同时加载 plyr 和 dplyr,您需要小心一点。 我建议先加载 plyr,然后是 dplyr,以便更快的 dplyr 函数首先出现在搜索路径中。 总的来说,dplyr 和 plyr 提供的任何函数都以类似的方式工作,尽管 dplyr 函数往往更快、更通用。

但请注意,您可以调用mapvalues使用plyr::mapvalues如果dplyr是无需负载plyr加载。

由于问题还提到

或者更好的是,dplyr 相当于什么?

等价物是重新编码。

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"))

这将“映射值” 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" ...

正如文档中所说,命名向量的顺序是 old (name) = new (value),这与dplyr::mutate()dplyr::rename()函数相反(在编写时,可能是稍后修复)。

添加此作为答案是因为当我忘记并且无法快速找到答案时,我一直在谷歌搜索如何做。 也许现在我可以了。 该解决方案是从函数文档中示例的最后两行修改而来的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM