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

问题描述 投票:0回答:1

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

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

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

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

r dplyr lag mutate
1个回答
1
投票

如果你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))
© www.soinside.com 2019 - 2024. All rights reserved.