在下面的可重现示例中,我想过滤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)
我应该如何进行这种比较?
答案 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