Несоответствие порядка оценки с dplyr mutate

У меня есть 2 функции, которые я использую внутри вызова mutate. Один выдает ожидаемые результаты для каждой строки, а другой повторяет одно и то же значение для всех строк:

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?


person Daniel Mahler    schedule 16.08.2016    source источник


Ответы (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))
person akrun    schedule 16.08.2016