正确的结果,但警告较长的对象长度不是较短的对象长度的倍数

时间:2015-11-02 16:34:28

标签: r dplyr

我有两个带可选过滤功能的功能(简化):

f <- function(df, categories=NULL) {
    df %>% filter(is.null(categories) || category %in% categories))
}

g <- function(df, categories=NULL) {
    df %>% filter(is.null(categories) || any(categories == category))
}
然后我做了:

compare(f(x, c('a', 'b')), g(x, c('a', 'b')))
microbenchmark(f(x, c('a', 'b')), g(x, c('a', 'b')), times = 10)

在大型数据集上。两个函数的输出是相同的。实际上有一些过滤:unique(x$category)显示了其他几个值。但是,g显示对象长度的警告。 g基准测试比f更快,尽管有警告(我认为可能很贵)。

是否有更好的方法来编写/优化此功能,或者至少可以在出现安全的情况下抑制警告?

1 个答案:

答案 0 :(得分:0)

filter需要获得长度等于df长度的向量。 any()总是需要长度为1的向量。底线是g()做的事情不同于f()

看一下这个例子

df <- data_frame(category = letters)
categories <- c("b", "a")
df$category %in% categories
categories == df$category
any(categories == df$category)

这是正确的做法

f <- function(df, categories=NULL) {
  if (is.null(categories)) {
    df
  } else {
    df %>% filter(category %in% categories))
  }
}