Как добавить результаты применения функции к существующему фрейму данных? - PullRequest
1 голос
/ 24 марта 2019

Я пытаюсь рассчитать доверительные интервалы некоторых показателей.Я использую tidyverse и epitools для вычисления КИ по методу Баяра.

Я почти наверняка делаю что-то не так.

library (tidyverse)
library (epitools)


# here's my made up data

DISEASE = c("Marco Polio","Marco Polio","Marco Polio","Marco Polio","Marco Polio",
            "Mumps","Mumps","Mumps","Mumps","Mumps",
            "Chicky Pox","Chicky Pox","Chicky Pox","Chicky Pox","Chicky Pox")
YEAR = c(2011, 2012, 2013, 2014, 2015,
         2011, 2012, 2013, 2014, 2015,
         2011, 2012, 2013, 2014, 2015)
VALUE = c(82,89,79,51,51,
          79,91,69,89,78,
          71,69,95,61,87)
AREA =c("A", "B","C")

DATA = data.frame(DISEASE, YEAR, VALUE,AREA)


# this is a simplification, I have the population values in another table, which I've merged 
# to give me the dataframe I then apply pois.byar to.
DATA$POPN = ifelse(DATA$AREA == "A",2.5,
              ifelse(DATA$AREA == "B",3,
                     ifelse(DATA$AREA == "C",7,0)))


# this bit calculates the number of things per area
rates<-DATA%>%group_by(DISEASE,AREA,POPN)%>%
  count(AREA)

Тогда, если я хочу рассчитать КИ, я подумал, что это сработает

rates<-DATA%>%group_by(DISEASE,AREA,POPN)%>%
  count(AREA) %>%
  mutate(pois.byar(rates$n,rates$POPN))

но я получаю

Error in mutate_impl(.data, dots) : 
  Evaluation error: arguments imply differing number of rows: 0, 1.

Это, однако, работает:

pois.byar(rates$n,rates$POPN)

Кажется глупым сказать: «превратить результаты функции pois.byar вдатафрейм, а затем слить обратно в оригинал ".Возможно, я пытался это сделать, просто чтобы получить некоторые данные .... Я не хочу этого делать.Это не правильный способ делать вещи.

Любой совет, с благодарностью полученный.Я думаю, что это довольно основная проблема.И свидетельствует о том, что я не сижу и не учусь, а пытаюсь делать что-то по ходу дела.

Вот что я хочу Болезнь Год n область popn x pt скорость ниже верхнего уровня conf.level

1 Ответ

1 голос
/ 24 марта 2019

Мне не ясно, какой ваш ожидаемый результат предполагается для меня. Ваш комментарий не очень помогает. Лучше всего явно включить ваш ожидаемый результат для данных образца, которые вы даете.

Проблема здесь в том, что pois.byvar возвращает data.frame. Таким образом, чтобы mutate мог использовать вывод pois.byvar, нам нужно сохранить data.frame s в list.

Вот более аккуратная версия вашего кода

library(tidyverse)
DATA %>%
    mutate(POPN = case_when(
        AREA == "A" ~ 2.5,
        AREA == "B" ~ 3,
        AREA == "C" ~ 7,
        TRUE ~ 0)) %>%
    group_by(DISEASE,AREA,POPN) %>%
    count(AREA) %>%
    mutate(res = list(pois.byar(n, POPN)))

Это создает столбец res, который содержит вывод data.frame pois.byar.

Или, возможно, вы захотите unnest столбец list, чтобы развернуть записи в разные столбцы?

library(tidyverse)
DATA %>%
    mutate(POPN = case_when(
        AREA == "A" ~ 2.5,
        AREA == "B" ~ 3,
        AREA == "C" ~ 7,
        TRUE ~ 0)) %>%
    group_by(DISEASE,AREA,POPN) %>%
    count(AREA) %>%
    mutate(res = list(pois.byar(n, POPN))) %>%
    unnest()
## A tibble: 9 x 10
## Groups:   DISEASE, AREA, POPN [9]
#  DISEASE     AREA   POPN     n     x    pt  rate  lower upper conf.level
#  <fct>       <fct> <dbl> <int> <int> <dbl> <dbl>  <dbl> <dbl>      <dbl>
#1 Chicky Pox  A       2.5     1     1   2.5 0.4   0.0363 1.86        0.95
#2 Chicky Pox  B       3       2     2   3   0.667 0.133  2.14        0.95
#3 Chicky Pox  C       7       2     2   7   0.286 0.0570 0.916       0.95
#4 Marco Polio A       2.5     2     2   2.5 0.8   0.160  2.56        0.95
#5 Marco Polio B       3       2     2   3   0.667 0.133  2.14        0.95
#6 Marco Polio C       7       1     1   7   0.143 0.0130 0.666       0.95
#7 Mumps       A       2.5     2     2   2.5 0.8   0.160  2.56        0.95
#8 Mumps       B       3       1     1   3   0.333 0.0302 1.55        0.95
#9 Mumps       C       7       2     2   7   0.286 0.0570 0.916       0.95
...