dplyr 的选择辅助函数 Everything() 与复制有何不同?

Posted

技术标签:

【中文标题】dplyr 的选择辅助函数 Everything() 与复制有何不同?【英文标题】:How does dplyr's select helper function everything() differ from copying? 【发布时间】:2016-09-07 09:37:32 【问题描述】:

有什么用例

select(iris, everything())

相对于例如只是复制data.frame?

【问题讨论】:

【参考方案1】:

?select 中寻找对everything 的引用,他们有一个用于重新排序列的示例:

# Reorder variables: keep the variable "Species" in the front
select(iris, Species, everything())

在这种情况下,Species 列被移动到第一列,所有列都被保留,没有列重复。

选择帮助器不仅仅用于 select 函数 - 例如,在 dplyr 1.0 及更高版本中,您可能希望在 across() 中使用它来改变或汇总所有列。

自从提出这个问题以来,选择助手已被分解到他们自己的包中,tidyselecttidyselect page on CRAN 有很长的反向导入列表 - 很可能许多导入 tidyselect 的包都有 everything() 有用的情况。

【讨论】:

【参考方案2】:

另一个示例用例:

# Moves the variable Petal.Length to the end
select(iris, -Petal.Length, everything())

(我在这里看到了:https://***.com/a/30472217/4663008)

无论哪种方式,Gregor 的回答和我的回答都让我感到困惑——我希望 Species 在 Gregor 的示例中被复制或在我的示例中被删除。例如如果您根据前两个示例尝试更复杂的操作,则不起作用:

> dplyr::select(iris, Petal.Width, -Petal.Length, everything())
    Petal.Width Sepal.Length Sepal.Width Petal.Length    Species
1           0.2          5.1         3.5          1.4     setosa
2           0.2          4.9         3.0          1.4     setosa
3           0.2          4.7         3.2          1.3     setosa

更新: 在 github 上的 hadley 快速response 之后,我发现使用everything() 和select() 中第一个位置的负数有一个特殊的行为,它将从所有变量开始select(),然后是所有变量() 将它们再次拉出。非第一位置的负变量不会像预期的那样起作用。

我同意第一个位置的负变量和everything() select_helper 函数需要在文档中更好地解释

更新 2:?select 的文档现已更新为“正值选择变量;负值删除变量。如果第一个表达式为负,则 select() 将自动从所有变量开始。”

【讨论】:

以上是关于dplyr 的选择辅助函数 Everything() 与复制有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包if_else条件判断选择函数实战

如何将列名作为参数传递给 dplyr 中的函数?

R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?

R语言基础知识|dplyr管道函数处理表格

dplyr

在 Shiny 的反应函数中使用 dplyr 条件过滤器