R dplyr Обобщая условия

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

У меня есть приведенный ниже код, который не работает, мне было интересно, может ли кто-нибудь помочь. Он дает мне ошибку: для раздела n_recent_downloads

Ошибка в FUN(X[[1L]], ...) : определяется только во фрейме данных со всеми числовыми переменными

reports <- c("Report_A","Report_B","Report_C","Report_D","Report_A","Report_A","Report_A","Report_D","Report_D","Report_D")
Week_no <- c(36,36,33,32,20,18,36,30,29,27)

New.Downloads <- data.frame (Report1 = reports, DL.Week =  Week_no)


test <- New.Downloads %>%
  group_by(report1) %>%
  summarise(n_downloads = n(),
        n_recent_downloads = ifelse(sum((as.integer(DL.Week) >= (as.integer(max(DL.Week))) - 4),value,0)))

person John Smith    schedule 20.08.2015    source источник
comment
Приведите воспроизводимый пример   -  person Koundy    schedule 20.08.2015
comment
R чувствителен к регистру (Report1 против report1). value не определено.   -  person Patrick Roocks    schedule 20.08.2015


Ответы (1)


Предоставление воспроизводимого примера сделало бы жизнь намного проще. Тем не менее, я изменил ваш код, чтобы сделать то, что, как я думаю, вы пытались достичь.

Я разделил его на две части, чтобы вы могли видеть, что происходит. Я переместил оператор ifelse в вызов mutate, который дает:

library(dplyr)

New.Downloads <- data.frame(
  Report1 = c("Report_A","Report_B","Report_C","Report_D","Report_A","Report_A","Report_A","Report_D","Report_D","Report_D"), 
  DL.Week = as.numeric(c(36,36,33,32,20,18,36,30,29,27))
)

test <- New.Downloads %>%
  group_by(Report1) %>%
  mutate(
    median = median(DL.Week),
    mad = 2 * mad(DL.Week),
    check = ifelse(DL.Week > median + mad | DL.Week < median - mad, 0, DL.Week)
  ) 

test

Source: local data frame [10 x 5]
Groups: Report1

    Report1 DL.Week median     mad check
1  Report_A      36   28.0 23.7216    36
2  Report_B      36   36.0  0.0000    36
3  Report_C      33   33.0  0.0000    33
4  Report_D      32   29.5  4.4478    32
5  Report_A      20   28.0 23.7216    20
6  Report_A      18   28.0 23.7216    18
7  Report_A      36   28.0 23.7216    36
8  Report_D      30   29.5  4.4478    30
9  Report_D      29   29.5  4.4478    29
10 Report_D      27   29.5  4.4478    27

Обратите внимание, что в вашем примере ни одно из значений не классифицируется как экстремальное по отношению к критерию median + 2 * mad, поэтому значения check идентичны DL.week.

Затем вы можете привязать summarise к концу этого, чтобы получить суммы.

test %>%
  summarise(
    n_recent_downloads = sum(check)
  )

Source: local data frame [4 x 2]

   Report1 n_recent_downloads
1 Report_A                110
2 Report_B                 36
3 Report_C                 33
4 Report_D                118
person ivyleavedtoadflax    schedule 20.08.2015