我尝试创建一个变量,该变量表示相对于组内变量的整个更改而言,另一个变量的滞后版本。
让我们使用以下示例数据框:
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
预先感谢,希望任何人都能提供帮助。
答案 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))