Создать лаги относительно всего изменения в группе - PullRequest
0 голосов
/ 13 ноября 2018

Я попытался создать переменную, которая представляет отставшую версию другой переменной относительно всего изменения переменной в группе.

Давайте использовать этот пример dataframe:

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 голосов
/ 13 ноября 2018

Если вы sum отстали, вы включаете NA. sum затем возвращает NA. Вы делите на NA, что в итоге возвращает NA для каждого значения. Чтобы избежать этого, просто установите аргумент na.rm на TRUE при вызове sum, и NA s не будут включены в сумму:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...