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

时间:2018-11-13 14:46:54

标签: r dplyr lag mutate

我尝试创建一个变量,该变量表示相对于组内变量的整个更改而言,另一个变量的滞后版本。

让我们使用以下示例数据框:

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

预先感谢,希望任何人都能提供帮助。

1 个答案:

答案 0 :(得分:1)

如果您sum落后得分,您将包括NA。然后sum返回NA。您除以NA,最后为每个值返回NA。为避免这种情况,只需在调用na.rm时将TRUE参数设置为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))