【问题标题】:Evaluation order inconsistency with dplyr mutate与 dplyr mutate 的评估顺序不一致
【发布时间】:2016-12-22 08:33:59
【问题描述】:

我在 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 是常量,其值实际上并不对应于任何行中的XY 值。

我怀疑这与 NSE 有关,但我不明白我是如何从小事中找到它的。

divpv 的行为不同的原因是什么?如何修复pv

【问题讨论】:

    标签: r dplyr lazy-evaluation operator-precedence nse


    【解决方案1】:

    我们需要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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多