【问题标题】:When is coding with dplyr (tidyverse) more complicated than base R? [closed]什么时候用 dplyr (tidyverse) 编码比 base R 更复杂? [关闭]
【发布时间】:2020-05-14 17:57:13
【问题描述】:

在阅读了令人信服的书R for Data Science 之后,我对tidyverse 的所有功能感到兴奋,尤其是转换和数据处理组件dplyrtidyr。与基本 R 相比,使用这些进行编码似乎可以节省大量时间并提高可读性。但是我使用 dplyr 的次数越多,我遇到的情况似乎相反的情况就越多。在我最后的questions 之一中,我询问如果其中一个变量超过某个阈值,如何用NAs 替换行。在base 我会简单地做

df[df$age > 90, ] <- NA

建议使用的两个答案

df %>% select(x, y, age) %>% mutate_all(~replace(.x, age> 90, NA))
# or
df %>% mutate_all(function(i) replace(i, .$age> 90, NA))

这两个答案都很棒,我很感激能得到它们。尽管如此,base R 中的代码对我来说似乎要简单得多。现在我面临另一种情况,我的 dplyr 代码也更加复杂。我知道某些代码是否复杂是一种主观印象,但以更客观的方式说,在许多情况下我会说nchar(dplyr_code) &gt; nchar(base_code)

此外,我注意到如果我需要编写的代码是关于行而不是列的操作,我似乎更经常遇到这种情况。可以说,可以使用 tidyr from tidyverse 来转置数据以将行更改为列。但即使这样做,在tidyverse 框架中似乎也比在基本 R 中复杂得多(参见here)。

我的问题是我遇到这个问题是因为我对tidyverse 很陌生,还是在某些情况下使用base 编码更有效。如果是后者:当使用basetidyverse 编码更有效时,是否有资源在抽象级别上进行总结,或者您能说明一些情况吗?我问是因为有时我花了不少时间来弄清楚如何使用tidyverse 解决问题,最后我注意到base 在这种情况下是一种更方便的编码。知道何时使用tidyversebase 进行数据整理和转换可以节省我很多时间。

如果这个问题太宽泛,请告诉我,我会尝试改写或删除问题。

【问题讨论】:

  • 很多 tidyverse 倡导者所倡导的优势在于代码清晰和教学法。我认为 tidyverse 对某些操作很有价值,但正如您所指出的,在某些情况下,代码要复杂几个数量级,至少对我而言,通常可读性较差。 tidyverse 包似乎要求你购买整个生态系统,即使 base R(或其他包)提供更短、更快、更易于理解的替代方案。
  • 除此之外,tidyverse 是围绕整洁的数据设计的,其中每一列是一个变量,每一行是一个观察值。正因为如此,做一整行NA 之类的操作基本上会删除观察结果,所以我认为你的代码的整洁等效实际上是filter(df, age &lt;= 90),以完全删除行(实际上可能不是你想要的,但是)。
  • 是的,明白,这是因为正如我上面所说,tidyverse 是围绕 1 列作为 1 个变量的概念设计的,这就是为什么它对于按行操作的函数设计不当,正如您所指出的。
  • 我不知道太宽泛,但这个问题是在征求意见,或者,根据你的大胆问题,场外资源,这两者都是题外话。
  • @TylerH 实际上比这更复杂。可能存在一条通用规则,说明在哪些情况下使用tidyverse 的语法效率较低。如果存在这样的规则,那么问题实际上不是基于意见的。通过将问题称为基于意见的问题,您隐含地用“没有这样的一般规则,只是不同的主观情况”来回答这个问题。而且我不确定是否是这种情况,以及您和其他投票结束问题的人是否知道这种情况。

标签: r dplyr tidyverse


【解决方案1】:

如果您有一个看起来更合适的基础 R 中干净、可读且功能强大的解决方案,您为什么要增加一层?也许是为了在脚本中保持相同的接口(管道)以提高可读性?但正如您所说,与基本 R 相比,tidyverse 并不总是能保证这一点。

主要区别在于:

Base R 高度关注稳定性,而 tidyverse 不能保证这一点。从他们自己的文档中:“tidyverse 将在寻找更好的接口时做出重大改变”(https://tidyverse.tidyverse.org/articles/paper.html)。

这使得 base R 在某些情况下成为生产环境的更好合作伙伴,因为您可能会发现 tidyverse 函数会随着时间的推移而被弃用和更改。我自己更喜欢在包中尽可能少的依赖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-22
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2011-05-29
    • 2020-07-05
    • 1970-01-01
    相关资源
    最近更新 更多