dplyr :: pull与purrr :: pluck和magrittr :: extract2的区别是什么?

时间:2019-01-09 15:56:25

标签: r tidyverse

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

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

但是我已经看到dplyr::pull()purrr::pluck()的存在也可以完成很多相同的工作:从数据帧返回单个矢量,与[[一样。

假设我始终为我从事的任何项目加载所有3个库,那么这3个函数中的每一个的优点和用例是什么?或更具体地讲,它们之间有什么区别?

1 个答案:

答案 0 :(得分:3)

何时“应该”使用功能实际上是个人喜好问题。哪个功能最清楚地表达了您的意图。有区别。它们之间。例如,pluck在您要进行多次提取时效果更好。从帮助文件:

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

因此,尽管可以将其仅用于提取列,但是当您具有更深层的嵌套结构或想要使用访问器函数组成时,它很有用。

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

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

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