我有一个在 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 的 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_ctr
is 列不正确的地方 - 它不是计算每行的点击和打开差异的 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()
;我刚刚把事情搞砸了。
谢谢您的帮助!!