![](/img/trans.png)
[英]dplyr alternative for plyr::mapvalues (recode using dictionary)
[英]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::mapvalues
与dplyr
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.