相对于组内的整体变化创建滞后

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相对于组内的整体变化创建滞后相关的知识,希望对你有一定的参考价值。

我已经尝试创建一个变量来表示相对于组中变量的整个变化的另一个变量的滞后版本。

让我们使用这个示例数据帧:

game_data <- data.frame(player = c(1,1,1,2,2,2,3,3,3), level = c(1,2,3,1,2,3,1,2,3), score=as.numeric(c(0,150,170,80,100,110,75,100,0)))
game_data
  player level score
1      1     1     0
2      1     2   150
3      1     3   170
4      2     1    80
5      2     2   100
6      2     3   110
7      3     1    75
8      3     2   100
9      3     3     0

我已经尝试了以下内容,但是当滞后变量有效时,我无法创建一个新变量来显示变量相对于玩家整个变化的滞后:

result <- 
+   game_data %>%
+   group_by(player) %>%
+   mutate(
+     lag_score = score - dplyr::lag(score, n=1, default = NA),
+     lag_score_relative = lag_score/sum(lag_score))

result
# A tibble: 9 x 5
# Groups:   player [3]
  player level score lag_score lag_score_relative
   <dbl> <dbl> <dbl>     <dbl>              <dbl>
1      1     1     0        NA                 NA
2      1     2   150       150                 NA
3      1     3   170        20                 NA
4      2     1    80        NA                 NA
5      2     2   100        20                 NA
6      2     3   110        10                 NA
7      3     1    75        NA                 NA
8      3     2   100        25                 NA
9      3     3     0      -100                 NA

例如,对于玩家1,它应该在等级1中:NA / 170 = NA等级2:150/170等级3:20/170

在此先感谢,我希望任何人都可以提供帮助。

答案

如果你sum滞后的分数,你包括NA。然后sum返回NA。你除以NA,它最终为每个值返回NA。为了避免这种情况,只需在你的na.rmTRUEs调用中将sum参数设置为NA,不要包含在总和中:

game_data <- data.frame(player = c(1,1,1,2,2,2,3,3,3), level = c(1,2,3,1,2,3,1,2,3), 
  score=as.numeric(c(0,150,170,80,100,110,75,100,0)))
   game_data %>%
   group_by(player) %>%
 mutate(
   lag_score = score - dplyr::lag(score, n=1, default = NA),
   lag_score_relative = lag_score/sum(lag_score, na.rm = TRUE))

以上是关于相对于组内的整体变化创建滞后的主要内容,如果未能解决你的问题,请参考以下文章

在 Pandas 中,创建一个相对于组内特定类别的变量

如何管理相对于组的用户权限?

SQL Server:跨组(而不是组内)的领先/滞后分析功能

BottomNavigationView 滞后于片段事务

如何相对于组中的值获得行号

计算具有基准年和相对百分比变化的指数