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::
даже тогда я приложил свой пакет.