dplyr :: group_modify для применения функции - PullRequest
0 голосов
/ 22 октября 2019

Я хотел бы применить функцию (вычислить биномиальный доверительный интервал) для каждой группы в кадре данных. Предположим, что у меня есть фрейм данных, содержащий следующее:

 df <- data.frame(group_name = sample(letters[1:5], 20, replace = T), numbers = 1:20, other_numbers = 51:70)

Я группирую по имени группы и создаю вектор для подачи в функцию точные символы:

install.packages('PropCIs');library('PropCIs') 

df2 <- df %>% 
   group_by(group_name) %>% 
   vector = c(numbers, other_numbers) %>%
   mutate(CI = exactci(vector, conf.level = 0.95))

Но уровни моего биномиальногопеременные недоступны.

В идеале я также хотел бы применить dplyr :: group_modify для создания таблицы, содержащей доверительные интервалы для биномиальной переменной для каждой группы, в дополнение к новой переменной в кадре данных, который содержит CI.

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Я не совсем уверен, правильно ли я использую exactci(), но, возможно, nest() может помочь.

df <- data.frame(
  group_name = sample(letters[1:5], 20, replace = T), 
  numbers = 1:20, 
  other_numbers = 51:70
)

library(PropCIs)
library(tidyverse) # tidyverse loads both dplyr and tidyr

df %>%
  nest(CI = -group_name) %>%
  mutate(CI = map(CI, ~ exactci(x = .x$numbers,
                                n = .x$other_numbers,
                                conf.level = .95) %>%
    unlist())
  ) %>%
  unnest_wider(CI)

#> # A tibble: 5 x 15
#>   group_name conf.int1 conf.int2 conf.int3 conf.int4 conf.int5 conf.int6
#>   <fct>          <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
#> 1 c           0.000496    0.115     0.155     0.184      0.104     0.327
#> 2 b           0.00469     0.0722    0.132     0.270     NA        NA    
#> 3 a           0.0118      0.0508    0.125     0.157      0.237     0.340
#> 4 e           0.0206      0.0403    0.104     0.135      0.145     0.165
#> 5 d           0.0302      0.0615    0.0829    0.0936     0.200     0.254
#> # ... with 8 more variables: conf.int7 <dbl>, conf.int8 <dbl>,
#> #   conf.int9 <dbl>, conf.int10 <dbl>, conf.int11 <dbl>, conf.int12 <dbl>,
#> #   conf.int13 <dbl>, conf.int14 <dbl>

Создано в 2019-10-22 представьте пакет (v0.3.0)

nest() действует как своего рода group_by(), а map() облегчает применение таких функций, как exactci().

Надеюсь, это поможет!

0 голосов
/ 22 октября 2019

Я пытался сделать это максимально чистым. Могу поспорить, кто-то может сделать более чистый код. Ура.

library(tidyverse)

df <- data.frame(group_name = sample(letters[1:5], 20, replace = T), numbers = 1:20, other_numbers = 51:70)

mean_ci <- function(x, conf = 0.95) {
  se <- sd(x) / sqrt(length(x))
  alpha <- 1 - conf
  mean(x) + se * qnorm(c(alpha / 2, 1 - alpha / 2))
}

df2 <- df %>% 
  group_by(group_name) %>%
  mutate(n_LCI = mean_ci(numbers)[1],
         n_UCI = mean_ci(numbers)[2],
         on_LCI = mean_ci(other_numbers)[1],
         on_UCI = mean_ci(other_numbers)[2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...