【问题标题】:Is there any explicit guarantee that dplyr operations preserve row order?是否有任何明确的保证 dplyr 操作保留行顺序?
【发布时间】:2020-05-27 02:56:22
【问题描述】:

当我教人们如何使用 dplyr 时,我警告他们不要假设任何 dplyr 函数都会保留其数据帧/小标题的顺序,除非文档另有说明。但是,我还没有找到任何关于此事的官方文档,这使得说服人们在假设他们的代码在做什么时应该更加小心变得更加困难。例如,mutate() 明确保证 number 行将被保留,但没有说明订单保留。是否有任何与 dplyr(或 tidyverse)相关的官方声明或文档,如果有的话,可以对函数中的行顺序保留做出哪些假设,我可以向人们指出这些假设?

【问题讨论】:

  • 据我所知,mutate 保留了顺序,但 summarise 没有,它按递增顺序排序。
  • 我也会在 RStudio Tidyverse 论坛上发布此内容:community.rstudio.com/c/tidyverse/6
  • 我可以清楚地看到 Tidyverse 通常应该保持秩序。看看最近的bug fix where one of the functions didn'tthis test 或者实际上是几个明确声明它改变顺序的函数。但我不确定这个隐含的规则是否反映在任何明确的原则中。
  • 你有你想保持顺序的函数的例子吗?
  • @JBGruber 有趣的是,与您链接的测试相关联的issue 准确地说明了为什么这很重要。有人做出了关于订单被保留的假设,而开发人员没有,然后包中的更改破坏了基于所述假设的脆弱代码。这只是14个月前。巧合的是,该问题关闭前的最后一条评论引发了与我在这里完全相同的担忧(没有回应)。

标签: r dplyr tidyverse


【解决方案1】:

这是来自mutate source code: 中的 Roxygen cmets

对于mutate()

  • 行不受影响。

  • 除非明确修改,否则将保留现有列。

  • 新列将添加到现有列的右侧。

  • 给定值NULL 的列将被删除 如果分组变量发生突变,将重新计算组。

  • 数据框属性被保留。

对于transmute()

  • 行不受影响。

  • 除了对变量进行分组外,现有列将被删除,除非明确保留。

  • 列顺序匹配表达式的顺序。

  • 如果分组变量发生突变,将重新计算组。

  • 数据框属性被保留。

我会解释为保留行顺序。由于它来自源代码,因此我认为它是规范的。

【讨论】:

  • 问题在于,如果有人过于迂腐(像我一样,我完全承认),那么这些陈述在很大程度上就其初衷和解释而言是模糊的。他们也没有告诉我包裹的其余部分。更重要的是,我向您保证,我正在帮助介绍 R、dplyr 等的科学家通常不是将通过包源代码中的 cmets 读取的类型(大多数是与编程);一般来说,让他们阅读任何文档已经够难了。
  • @anjama 我同意措辞可能会更好,但是“行不受影响”还有什么意思?如果您想知道软件包的其余部分,我们知道有些功能,例如 summarise do 更改顺序,因此您需要根据每个功能的优点来考虑。询问 package 是否保持顺序并没有真正的意义。另外,您不需要不需要引导科学家去看文档。你是在教他们,所以你只需要通过阅读源代码来满足自己。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 2016-12-11
  • 2020-10-11
  • 2015-05-30
相关资源
最近更新 更多