我有一个包含多个游戏评论的数据集,我想计算每个游戏在相应日期之前的总得分-因此基本上是用户在每一天看到的总得分。
评论是二进制的,所以它只是一个投票/否决系统,其中列中的每个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语句的组合,但实际上无法将其表述(并怀疑它对于大型数据集的效率...)
答案 0 :(得分:1)
这是使用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
答案 1 :(得分:0)
假设您的数据框名为~/Android/Sdk/emulator/emulator -avd Nexus_9_API_23 -dns-server 1.0.2.2
,您可以:
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