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