dplyr rowwise и mutate с пользовательской функцией возвращают неожиданный вывод

У меня есть датафрейм, который выглядит так в R:

library(dplyr)

group <- c(1,2,3,4,5,6)
num_click <- c(33000, 34000, 35000, 33500, 34500, 32900)
num_open <- c(999000, 999500, 1000000, 1000050, 985000, 999999)
df <- data.frame(group, num_click, num_open)

> df
#  group num_click num_open
# 1     1     33000   999000
# 2     2     34000   999500
# 3     3     35000  1000000
# 4     4     33500  1000050
# 5     5     34500   985000
# 6     6     32900   999999

и я написал две тривиальные функции, которые я хотел бы применить к каждой строке:

prop_test_ctr <- function(open, click){
  return(prop.test(c(click, 34000), c(open, 999000), correct = FALSE)$p.value)
}

add_one_to_group <- function(group) {
  return(group + 1)
}

prop_test_ctr функция использует prop.test функция из пакета статистики R для проверки нулевой гипотезы о том, что пропорции нескольких групп одинаковы; $p.value это выходное значение, которое я собираю здесь, которое соответствует p-значению теста.

add_one_to_group Функция - это простая функция, которая добавляет 1 к каждому group_num в df, поэтому я могу убедиться, что rowwise() работает так, как ожидалось.

Когда я пытаюсь построить новый results фрейм данных, применяя две функции к каждой строке, используя dyplr rowwise() со следующим:

results <- df %>%
  filter(group %in% c(1,2)) %>%
  rowwise() %>%
  mutate(p_value_ctr = prop_test_ctr(num_open,num_click),
         group_plus_one = add_one_to_group(group))

это дает этот вывод:

results
# A tibble: 2 x 5
  group num_click num_open   p_value_ctr group_plus_one
* <dbl>     <dbl>    <dbl>         <dbl>          <dbl>
1     1     33000   999000 0.00004201837              2
2     2     34000   999500 0.00004201837              3

Где p_value_ctr является неправильным столбцом - вместо вычисления значения p для разницы в щелчках и открытия для каждой строки вычисляется значение p для комбинации групп 2,3 и значений, жестко закодированных в prop_test_ctr функция (34000 и 999000).

add_one_to_group функция работает как положено с использованием rowwise() но p_value_ctr не. Значение р, что p_value_ctr функция возвращает фактически равна тому же значению, как если бы я запустил:

prop.test(c(33000, 34000, 34000), c(999000, 999500, 999000))$p.value

Оказывается, что вектор столбца clicks а также opens для обеих групп 2 и 3 передается функции вместо предполагаемого значения столбца только для одной строки (следовательно, пользователь rowwise(),

Я знаю, что есть другие способы сделать это, но особенно любопытно, могу ли я остаться здесь во вселенной dpylr (в отличие от использования sapply() и затем связать эти результаты с исходным df, например), потому что кажется, что это должно быть предполагаемое поведение rowwise(); Я просто что-то напутал.

Спасибо за помощь!!

1 ответ

Похоже, что проблема была из-за mutate функция маскируется другой идентично названной функцией (скорее всего plyr::mutate). Перезапуск в чистом сеансе R исправил проблему.

Спасибо @user2738526 за ваш ответ! Похоже, что мутация была в маске была проблемой

Из-за общей природы dplyr имена функций, я часто определяю их пакет с dplyr:: даже тогда я приложил свой пакет.

Другие вопросы по тегам