dplyr 过滤器中的标量比较

scalars comparison in dplyr filter

在以下可重现的示例中,我想过滤 df 中变量表达式给出特定结果的行。第 1 行和第 3 行符合要求,应退回。但是我的第一次尝试是不正确的,因为我使用 == 来比较标量。

df <- data.frame(matrix(c(1,8,3,7,4,5,6,2,9,1,2,3,4,5,6,7,8,9,9,6,4,3,5,8,1,7,2),ncol=9,byrow=T))

df %>%
    filter(X1+13*X2/X3+X4+12*X5-X6-11+X7*X8/X9-10==66)

  X1 X2 X3 X4 X5 X6 X7 X8 X9
1  9  6  4  3  5  8  1  7  2

我尝试使用 isTRUE(all.equal(...)) 方法更正我的错误,但令我惊讶的是我根本没有得到任何结果。

df %>%
    filter(isTRUE(all.equal(X1+13*X2/X3+X4+12*X5-X6-11+X7*X8/X9-10,66))) 

[1] X1 X2 X3 X4 X5 X6 X7 X8 X9
<0 rows> (or 0-length row.names)

我应该如何进行比较?

isTRUE returns 一个长度为一的逻辑向量,所以你的第二个语句等同于

df %>% filter(FALSE)

要获得您想要的结果,您可能需要做一些额外的工作。一种可能性是使用 mutate 来计算您的条件是否满足,然后进行过滤。

df %>% 
  # calculate condition
  mutate(value = X1+13*X2/X3+X4+12*X5-X6-11+X7*X8/X9-10, 
         cond = sapply(value, function(x) isTRUE(all.equal(x, 66)))) %>%
  # filter
  filter(cond) %>%
  # remove unnecessary values
  mutate(value = NULL, cond = NULL)
##   X1 X2 X3 X4 X5 X6 X7 X8 X9
## 1  1  8  3  7  4  5  6  2  9
## 2  9  6  4  3  5  8  1  7  2

all.equal 未矢量化 - 为什么不

df %>% 
    filter(abs(X1+13*X2/X3+X4+12*X5-X6-11+X7*X8/X9-10 - 66) < 1e-8)