【问题标题】:Exclude multiple values in a vector in a pipe排除管道中向量中的多个值
【发布时间】:2021-05-19 09:35:57
【问题描述】:

我正在寻找一种更优雅的方法来从管道中的向量中排除多个值。下面的代码实现了我所需要的,但非常难看。你能想出一个替代方案吗?

values_to_exclude <- c("b", "d")
        
letters[1:5] %>%
    .[ !(. %in% values_to_exclude) ] # quite ugly

【问题讨论】:

  • 一定要用管道吗? setdiff(letters[1:5], values_to_exclude) 为什么这不适用于您的用例?
  • 它肯定会起作用。我通常将“letters[1:5]”部分创建为较长管道块的一部分,但 letters[1:5] %>% setdiff(values_to_exclude) 肯定会起作用。

标签: r functional-programming magrittr


【解决方案1】:

这不使用purrr,但是这样的东西怎么样:

values_to_exclude <- c("b", "d")
letters[1:5] %>% setdiff(., values_to_exclude)
# [1] "a" "c" "e"

【讨论】:

  • 很棒的提示。更喜欢这样的字母[1:5] %>% setdiff(values_to_exclude)
【解决方案2】:

magrittr 包带有一整套便利功能。例如extract:

library(magrittr)
letters[1:5] %>%
    extract(!(. %in% values_to_exclude))
[1] "a" "c" "e"

但是,在这种情况下,您可以以相同的方式使用base::subset

letters[1:5] %>%
   subset(!(. %in% values_to_exclude))

【讨论】:

  • 有一个特定的magrittr 运算符等效于%in%:letters[1:5] %&gt;% extract(!is_in(., values_to_exclude))
【解决方案3】:

想提供另一个base R 解决方案:

letters[1:5][!letters[1:5] %in% values_to_exclude]

既然美丽在旁观者的眼中......我认为如果您要参考过去的代码,这更容易解释。不过,我认为其他一些解决方案更高效、更简洁。

【讨论】:

  • 我同意代码美感是主观的,但对我来说,这个特殊的解决方案似乎很难阅读。不过感谢您的努力。
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 2016-06-09
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多