Обновление общего среднего (обзорный балл) за день и предмет - PullRequest
0 голосов
/ 30 ноября 2018

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

Отзывыбинарная система, так что это просто система повышения / понижения голосов, где каждая 1 в столбце положительно отмечает положительный голос:

game_id     created     positive
123         2018-07-18  1
123         2018-07-18  0
123         2018-07-18  1
123         2018-07-19  1 
456         2018-06-23  1
456         2018-06-25  1
456         2018-06-25  0
456         2018-06-26  1
789         2018-07-18  1

вычисление общего среднего значения за день легко с

group_by(game_id, created) %>% 
    summarise(sum(positive)/n()

, но яЯ борюсь с тем, как включить обзоры предыдущих дней.

Я хочу, чтобы это выглядело так:

game_id     created     total_score
123         2018-07-18  0.66
123         2018-07-19  0.75 
456         2018-06-23  1.0
456         2018-06-25  0.5
456         2018-06-26  0.66
789         2018-07-18  1

Я думал об использовании комбинации цикла и оператора if, ноя не могу сформулировать его (и сомневаюсь в его эффективности для больших наборов данных ...)

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вот способ добиться этого, используя dplyr.Ключевым моментом здесь является создание промежуточного вычисления кумулятивных сумм, а затем использование их для отношения:

df %>%
  group_by(game_id, created) %>%
  summarise(pos=sum(positive), tot=n()) %>%
  group_by(game_id) %>%
  mutate(pct = cumsum(pos) / cumsum(tot))

# A tibble: 6 x 5
# Groups:   game_id [3]
  game_id created      pos   tot   pct
    <int> <fct>      <int> <int> <dbl>
1     123 2018-07-18     2     3 0.667
2     123 2018-07-19     1     1 0.75 
3     456 2018-06-23     1     1 1    
4     456 2018-06-25     1     2 0.667
5     456 2018-06-26     1     1 0.75 
6     789 2018-07-18     1     1 1    
0 голосов
/ 30 ноября 2018

Предполагая, что ваш фрейм данных имеет имя df, вы можете:

library(dplyr)
df= arrange(df, game_id,created)    ## sort dataset
df$csum <- ave(df$positive, df$game_id, FUN=cumsum)  ## create cumulative sum

, чтобы создать совокупную сумму для каждого game_id.Убедитесь, что ваш фрейм данных отсортирован по game_id и created

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...