简体   繁体   中英

Calling prop.test function in R with dplyr

I am trying to calculate several binomial proportion confidence intervals. My data are in a data frame, and though I can successfully extract the estimate from the object returned by prop.test , the conf.int variable seems to be null when run on the data frame.

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)

This appropriately returns

    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

However, when I run

df %>% mutate(confint.lower= prop.test(cases, pop, conf.level=0.95)$conf.int[1])

I sadly get

Error in mutate_impl(.data, dots) : 
  Column `confint.lower` is of unsupported type NULL

Any thoughts? I know alternative ways to calculate the binomial proportion confidence interval, but I would really like to learn how to use dplyr well.

Thank you!

You can use dplyr::rowwise() to group on rows:

df %>%
    rowwise() %>%
    mutate(lower_ci = prop.test(cases, pop, conf.level=0.95)$conf.int[1])

By default dplyr takes the column names and treats them like vectors. So vectorized functions, like @Jake Fisher mentioned above, just work without rowwise() added.

This is what I would do to catch all of the confidence interval components at once:

df %>%
    rowwise %>%
    mutate(tst = list(broom::tidy(prop.test(cases, pop, conf.level=0.95)))) %>%
    tidyr::unnest(tst)

As of version 1.0.0, rowwise() is no longer being questioned.

As of version 0.8.3 of dplyr , the lifecycle status of the rowwise() function is "questioning".

As an alternative, I would rather recommend the use of purrr::map2() to achieve the goal:

df %>%
  mutate(rate = map2(cases, pop, ~ prop.test(.x, .y, conf.level=0.95) %>%
                                     broom::tidy())) %>%
  unnest(rate)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM