1

我有一个在 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.testR 的 stats 包中的函数来检验几组的比例相同的原假设;这$p.value是我在这里抓取的输出值,它对应于测试的 p 值。

add_one_to_group函数是一个简单的函数,可以为 df 中的每个 group_num 添加 1,因此我可以验证 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_ctris 列不正确的地方 - 它不是计算每行的点击和打开差异的 p 值,而是计算组 2,3 组合的 p 值和函数中硬编码的值prop_test_ctr(34000和 999000)。

add_one_to_group函数在使用 of 时按预期工作,rowwise()p_value_ctr不是。函数返回的 p 值p_value_ctr实际上等于我运行的值:

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

似乎列的向量clicks以及第 2 组和第 3 组的向量都被传递给函数,而不是仅一行opens的预期列值(因此.rowwise()

我知道还有其他方法可以做到这一点,但特别好奇我是否可以在这里停留在 dpylr 宇宙中(而不是使用 sapply() 然后将这些结果与原始 df 绑定,例如),因为看起来应该是的预期行为rowwise();我刚刚把事情搞砸了。

谢谢您的帮助!!

4

1 回答 1

0

看起来问题是由于该mutate函数被另一个同名函数(很可能plyr::mutate)掩盖了。在干净的 R 会话中重新启动解决了该问题。

感谢@user2738526 的回复!看起来变异被掩盖是问题

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

于 2018-04-26T15:00:00.553 回答