dplyr过滤器中的标量比较

时间:2015-05-21 11:54:22

标签: r dplyr

在下面的可重现示例中,我想过滤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)

我应该如何进行这种比较?

2 个答案:

答案 0 :(得分:5)

all.equal没有矢量化 - 为什么不呢?

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

答案 1 :(得分:1)

isTRUE返回一个长度为一的逻辑向量,因此您的第二个语句等同于

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