过去,当使用数据框并希望将单个列作为矢量时,我将使用magrittr::extract2()
像这样:
mtcars %>%
mutate(wt_to_hp = wt/hp) %>%
extract2('wt_to_hp')
但是我已经看到
dplyr::pull()
和purrr::pluck()
也存在做相同的工作:从数据帧返回单个矢量,与[[
一样。假设我始终为我从事的任何项目加载所有3个库,那么这3个函数中的每一个的优点和用例是什么?或更具体地说,它们之间有什么区别?
最佳答案
当您“应该”使用功能时,实际上是个人喜好问题。哪个功能最清楚地表达了您的意图。它们之间有区别。例如,当您想进行多次提取时,pluck
效果更好。从帮助文件:
accessor(x[[1]])$foo
# is the same as
pluck(x, 1, accessor, "foo")
因此,尽管可以将其仅用于提取列,但是当您具有更深层的嵌套结构或想要使用访问器函数进行组合时,它很有用。
pull
函数用于与dplyr
函数的结果融合。它可以使用包中其他函数的任何方式来作为列的名称。例如,它将与!!
样式扩展一起使用,而extract2
则不能。irispull <- function(x) {
iris %>% pull(!!enquo(x))
}
irispull(Sepal.Length)
而
extract2
仅仅是基本功能[[
的“更易读”包装。实际上,它被定义为.Primitive("[[")
,因此它希望将列名作为字符或列索引和整数。