过去,在使用数据框时,想要将单个列作为向量获取,我会像这样使用 magrittr::extract2()
:
mtcars %>%
mutate(wt_to_hp = wt/hp) %>%
extract2('wt_to_hp')
但我发现 dplyr::pull()
和 purrr::pluck()
也可以完成同样的工作:从数据框中返回一个单矢量,类似于[[
。
假设我在任何项目中都加载了这3个库,每个函数有什么优势和用例呢?或者更具体地说,它们之间有什么区别?
过去,在使用数据框时,想要将单个列作为向量获取,我会像这样使用 magrittr::extract2()
:
mtcars %>%
mutate(wt_to_hp = wt/hp) %>%
extract2('wt_to_hp')
但我发现 dplyr::pull()
和 purrr::pluck()
也可以完成同样的工作:从数据框中返回一个单矢量,类似于[[
。
假设我在任何项目中都加载了这3个库,每个函数有什么优势和用例呢?或者更具体地说,它们之间有什么区别?
什么时候应该使用函数,这实际上取决于个人喜好。哪个函数最清楚地表达了您的意图,就使用哪个函数。它们之间存在差异。例如,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("[[")
,因此它期望列名作为字符或列索引和整数。
pluck
允许赋值(例如,pluck(x, "col") <- value
),但 pull
不允许。 - Jay
[[
。如果你喜欢,你可以定义mypull <-
[[``,然后添加... %>% mypull('wt_to_hp')
。 - s_baldurdplyr::pull(wt_to_hp)
的优点是可以在有或没有引号的情况下使用,而其他两个则不行。 - RLavedata.frame()
时,它们会给出不同的结果(不知道这是否有用)。 - RLave