我正在尝试计算几个二项式比例置信区间。我的数据在数据框中,虽然我可以成功地从prop.test
返回的对象中提取estimate
,但在数据帧上运行时,conf.int
变量似乎为 null。
library(dplyr)
cases <- c(50000, 1000, 10, 2343242)
population <- c(100000000, 500000000, 100000, 200000000)
df <- as.data.frame(cbind(cases, population))
df %>% mutate(rate = prop.test(cases, population, conf.level=0.95)$estimate)
这适当地返回
cases population rate
1 50000 1e+08 0.00050000
2 1000 5e+08 0.00000200
3 10 1e+05 0.00010000
4 2343242 2e+08 0.01171621
但是,当我跑步时
df %>% mutate(confint.lower= prop.test(cases, pop, conf.level=0.95)$conf.int[1])
我可悲地得到
Error in mutate_impl(.data, dots) :
Column `confint.lower` is of unsupported type NULL
有什么想法吗?我知道计算二项式比例置信区间的替代方法,但我真的很想学习如何很好地使用dplyr
。
谢谢!
您可以使用dplyr::rowwise()
按行分组:
df %>%
rowwise() %>%
mutate(lower_ci = prop.test(cases, pop, conf.level=0.95)$conf.int[1])
默认情况下,dplyr
采用列名并将它们视为向量。因此,矢量化函数,如上面提到的@Jake Fisher,无需添加rowwise()
即可工作。
这就是我一次捕获所有置信区间分量的方法:
df %>%
rowwise %>%
mutate(tst = list(broom::tidy(prop.test(cases, pop, conf.level=0.95)))) %>%
tidyr::unnest(tst)
从版本1.0.0开始,rowwise()
不再受到质疑。
从dplyr
0.8.3版本开始,rowwise()
函数的生命周期状态为"质疑"。
作为替代方案,我宁愿建议使用purrr::map2()
来实现目标:
df %>%
mutate(rate = map2(cases, pop, ~ prop.test(.x, .y, conf.level=0.95) %>%
broom::tidy())) %>%
unnest(rate)