【问题标题】:What distinguishes dplyr::pull from purrr::pluck and magrittr::extract2?dplyr::pull 与 purrr::pluck 和 magrittr::extract2 的区别是什么?
【发布时间】:2019-06-04 10:46:31
【问题描述】:

过去,当使用数据框并希望将单列作为向量时,我会像这样使用magrittr::extract2():

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

但我已经看到 dplyr::pull() 和 purrr::pluck() 也可以完成相同的工作:从数据框中返回单个向量,与 [[ 不同。

假设我总是为我从事的任何项目加载所有 3 个库,那么这 3 个函数各自的优势和用例是什么?或者更具体地说,它们之间的区别是什么?

【问题讨论】:

  • 我会使用[[。如果你喜欢你可以定义mypull <- [[`` 然后添加... %>% mypull('wt_to_hp')
  • dplyr::pull(wt_to_hp) 的优点是可以使用和不使用引号,这与其他两个不同。
  • 当你有一个空的data.frame()时,它们也会给出不同的结果(不知道这是否有用)..

标签: r tidyverse


【解决方案1】:

何时“应该”使用某个功能实际上是个人喜好问题。哪个功能最清楚地表达了您的意图。它们之间存在差异。例如,当您想要进行多次提取时,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("[["),因此它期望列名作为字符或列索引和整数。

【讨论】:

  • 感谢您的回答!只是想补充一点,我注意到 pluck 允许赋值(例如,pluck(x, "col") &lt;- value)但 pull 不允许。
猜你喜欢
  • 2014-10-02
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2015-04-20
  • 2020-04-29
  • 2011-04-06
相关资源
最近更新 更多