【发布时间】:2020-05-14 17:57:13
【问题描述】:
在阅读了令人信服的书R for Data Science 之后,我对tidyverse 的所有功能感到兴奋,尤其是转换和数据处理组件dplyr 和tidyr。与基本 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) > nchar(base_code)。
此外,我注意到如果我需要编写的代码是关于行而不是列的操作,我似乎更经常遇到这种情况。可以说,可以使用 tidyr from tidyverse 来转置数据以将行更改为列。但即使这样做,在tidyverse 框架中似乎也比在基本 R 中复杂得多(参见here)。
我的问题是我遇到这个问题是因为我对tidyverse 很陌生,还是在某些情况下使用base 编码更有效。如果是后者:当使用base 与tidyverse 编码更有效时,是否有资源在抽象级别上进行总结,或者您能说明一些情况吗?我问是因为有时我花了不少时间来弄清楚如何使用tidyverse 解决问题,最后我注意到base 在这种情况下是一种更方便的编码。知道何时使用tidyverse 或base 进行数据整理和转换可以节省我很多时间。
如果这个问题太宽泛,请告诉我,我会尝试改写或删除问题。
【问题讨论】:
-
很多 tidyverse 倡导者所倡导的优势在于代码清晰和教学法。我认为 tidyverse 对某些操作很有价值,但正如您所指出的,在某些情况下,代码要复杂几个数量级,至少对我而言,通常可读性较差。 tidyverse 包似乎要求你购买整个生态系统,即使 base R(或其他包)提供更短、更快、更易于理解的替代方案。
-
除此之外,tidyverse 是围绕整洁的数据设计的,其中每一列是一个变量,每一行是一个观察值。正因为如此,做一整行
NA之类的操作基本上会删除观察结果,所以我认为你的代码的整洁等效实际上是filter(df, age <= 90),以完全删除行(实际上可能不是你想要的,但是)。 -
是的,明白,这是因为正如我上面所说,tidyverse 是围绕 1 列作为 1 个变量的概念设计的,这就是为什么它对于按行操作的函数设计不当,正如您所指出的。
-
我不知道太宽泛,但这个问题是在征求意见,或者,根据你的大胆问题,场外资源,这两者都是题外话。
-
@TylerH 实际上比这更复杂。可能存在一条通用规则,说明在哪些情况下使用
tidyverse的语法效率较低。如果存在这样的规则,那么问题实际上不是基于意见的。通过将问题称为基于意见的问题,您隐含地用“没有这样的一般规则,只是不同的主观情况”来回答这个问题。而且我不确定是否是这种情况,以及您和其他投票结束问题的人是否知道这种情况。