使用自定义函数的dplyr rowwise和mutate返回意外输出

时间:2017-08-25 01:49:42

标签: r dplyr mutate rowwise

我在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函数使用R&lt; stats包中的prop.test函数来测试零假设,即几个组的比例相同; $p.value是我在这里抓取的输出值,它对应于测试的p值。

add_one_to_group函数是一个简单的函数,可以在df中为每个group_num添加1,这样我就可以验证rowwise()是否按预期工作。

当我尝试使用dyplr&#39; s results将以下两个函数应用于每一行时,尝试构建新的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值,而是计算组2,3和值组合的p值在prop_test_ctr函数(34000和999000)中进行了硬编码。

add_one_to_group函数使用rowwise()按预期工作,但p_value_ctr没有。 p_value_ctr函数返回的p值实际上等于我运行的相同值:

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

看来,第2组和第3组的列clicksopens的向量传递给函数而不是只有一行的预期列值(因此是rowwise()的用户。

我知道还有其他方法可以实现这一点,但特别好奇我是否可以留在dpylr Universe中(而不是使用sapply()然后cbind那些结果原始df,例如)因为它看起来像这应该是rowwise()的预期行为;我搞砸了一些东西。

感谢您的帮助!!

1 个答案:

答案 0 :(得分:0)

看起来这个问题是由于plyr::mutate函数被另一个同名的函数(很可能是dplyr)所掩盖。重新启动干净的R会话修复了问题。

  

感谢@ user2738526的回复!看起来像变异   蒙面是个问题

由于dplyr::函数名称的通用特性,我经常使用__repr__定义其包,即使我已附加其包。