评估顺序与 dplyr mutate 不一致
Evaluation order inconsistency with dplyr mutate
我在 mutate 调用中使用了 2 个函数。一个按预期生成每行结果,而另一个对所有行重复相同的值:
library(dplyr)
df <- data.frame(X = rpois(5, 10), Y = rpois(5,10))
pv <- function(a, b) {
fisher.test(matrix(c(a, b, 10, 10), 2, 2),
alternative='greater')$p.value
}
div <- function(a, b) a/b
mutate(df, d = div(X,Y), p = pv(X, Y))
产生类似的东西:
X Y d p
1 9 15 0.6000000 0.4398077
2 8 7 1.1428571 0.4398077
3 9 14 0.6428571 0.4398077
4 11 15 0.7333333 0.4398077
5 11 7 1.5714286 0.4398077
即 d
列变化,但 v
不变,其值实际上并不对应于任何行中的 X
和 Y
值。
我怀疑这与 NSE 有关,但我不明白我是如何从中了解到它的。
是什么导致了 div
和 pv
的不同行为?如何修复 pv
?
我们需要rowwise
df %>%
rowwise() %>%
mutate(d = div(X,Y), p = pv(X,Y))
# X Y d p
# <int> <int> <dbl> <dbl>
#1 10 9 1.111111 0.5619072
#2 12 8 1.500000 0.3755932
#3 9 8 1.125000 0.5601923
#4 11 16 0.687500 0.8232217
#5 16 10 1.600000 0.3145350
在 OP 的代码中,pv
将 'X' 和 'Y' 列作为输入,并提供单个输出。
或者如@Frank 提到的,可以使用mapply
df %>%
mutate(d = div(X,Y), p = mapply(pv, X, Y))
我在 mutate 调用中使用了 2 个函数。一个按预期生成每行结果,而另一个对所有行重复相同的值:
library(dplyr)
df <- data.frame(X = rpois(5, 10), Y = rpois(5,10))
pv <- function(a, b) {
fisher.test(matrix(c(a, b, 10, 10), 2, 2),
alternative='greater')$p.value
}
div <- function(a, b) a/b
mutate(df, d = div(X,Y), p = pv(X, Y))
产生类似的东西:
X Y d p
1 9 15 0.6000000 0.4398077
2 8 7 1.1428571 0.4398077
3 9 14 0.6428571 0.4398077
4 11 15 0.7333333 0.4398077
5 11 7 1.5714286 0.4398077
即 d
列变化,但 v
不变,其值实际上并不对应于任何行中的 X
和 Y
值。
我怀疑这与 NSE 有关,但我不明白我是如何从中了解到它的。
是什么导致了 div
和 pv
的不同行为?如何修复 pv
?
我们需要rowwise
df %>%
rowwise() %>%
mutate(d = div(X,Y), p = pv(X,Y))
# X Y d p
# <int> <int> <dbl> <dbl>
#1 10 9 1.111111 0.5619072
#2 12 8 1.500000 0.3755932
#3 9 8 1.125000 0.5601923
#4 11 16 0.687500 0.8232217
#5 16 10 1.600000 0.3145350
在 OP 的代码中,pv
将 'X' 和 'Y' 列作为输入,并提供单个输出。
或者如@Frank 提到的,可以使用mapply
df %>%
mutate(d = div(X,Y), p = mapply(pv, X, Y))