dplyr::pull与purrr::pluck和magrittr::extract2有何不同?

10

过去,在使用数据框时,想要将单个列作为向量获取,我会像这样使用 magrittr::extract2()

mtcars %>%
  mutate(wt_to_hp = wt/hp) %>%
  extract2('wt_to_hp')

但我发现 dplyr::pull()purrr::pluck() 也可以完成同样的工作:从数据框中返回一个单矢量,类似于[[

假设我在任何项目中都加载了这3个库,每个函数有什么优势和用例呢?或者更具体地说,它们之间有什么区别?


2
我会使用[[。如果你喜欢,你可以定义mypull <- [[``,然后添加... %>% mypull('wt_to_hp') - s_baldur
1
dplyr::pull(wt_to_hp) 的优点是可以在有或没有引号的情况下使用,而其他两个则不行。 - RLave
当你有一个空的data.frame()时,它们会给出不同的结果(不知道这是否有用)。 - RLave
1个回答

11

什么时候应该使用函数,这实际上取决于个人喜好。哪个函数最清楚地表达了您的意图,就使用哪个函数。它们之间存在差异。例如,pluck 在您想要执行多个提取操作时效果更好。来自帮助文件:

 accessor(x[[1]])$foo 
 # is the same as
 pluck(x, 1, accessor, "foo")

因此,虽然它可以用于提取一个列,但当您具有更深层嵌套的结构或者想要与访问器函数组合时,pull 函数非常有用。

pull 函数旨在与 dplyr 函数的结果融合。它可以使用包中其他函数支持的任何方式来使用列名称。例如,它将与 !! 样式扩展一起使用,而 extract2 则不会。

irispull <- function(x) {
  iris %>% pull(!!enquo(x))
}
irispull(Sepal.Length)

extract2 只是基本函数 [[ 的“更易读”的包装器。实际上,它被定义为 .Primitive("[["),因此它期望列名作为字符或列索引和整数。


1
谢谢回答!只想补充一下,我注意到 pluck 允许赋值(例如,pluck(x, "col") <- value),但 pull 不允许。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接