Как я могу создать промежуточную сумму для столбца во фрейме данных, но пропустить первое наблюдение? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь создать регрессионную модель в R, которая предсказывает счет игроков в гольф для следующей лунки.Входным параметром, который оказался хорошим индикатором того, «что будет дальше», являются кумулятивные оценки предыдущей лунки, но у меня возникают проблемы с добавлением этого столбца программным способом.Например, в лунке # 1 кумулятивный счет игрока равен 0, игрок берет 5 на первом лунке, поэтому кумулятивный счёт в лунке № 2 равен 5 (0 + 5) и т. Д.

Я смогиспользовать dplyr для успешного добавления столбца (cum_score) во фрейм данных, но это не совсем в контексте, который мне нужен.Мой код начнет «кумулятивизацию» на лунке № 1, поэтому совокупный балл на лунке № 1 будет равен 5 в этом случае, когда он должен быть равен нулю.По сути, мне нужно пропустить первое наблюдение, а затем запустить итоговую сумму.

То, что я создал, используя

scores <- scores %>% group_by(round_id) %>% mutate(cum_score = cumsum(score))

round_id  score_id  hole_number  score  cum_score
1         100       1            4      4
1         101       2            5      9
1         102       3            4      13
1         103       4            4      17
...
2         150       1            6      6
2         151       2            4      10
...

Я могу получить то, что хочу, запустив приведенное ниже, но затем теряюданные для отверстия № 1, и я не уверен, как «вставить» только столбец cum_score обратно во фрейм данных

scores %>% group_by(round_id) %>% filter(hole_number > 1) %>% mutate(cum_score = cumsum(score))

Что я хотел бы создать

round_id  score_id  hole_number  score  cum_score
1         100       1            4      0
1         101       2            5      4
1         102       3            4      9
1         103       4            4      13
...
2         150       1            6      0
2         151       2            4      6
...

Во-первых, спасибоВы за ответы до сих пор, но пока ответы даны будут просто пропустить первый ряд.Лучший пример данных ниже

round_id  score_id  hole_number  score  cum_score(what i need)  what the answers output
1         100       1            4      0                        0
1         101       2            4      4                        4
1         102       3            4      8                        8
1         103       4            3      12                       11
1         104       5            4      15                       15

1 Ответ

0 голосов
/ 21 декабря 2018

Есть несколько способов сделать это.Один из способов - убедиться, что первая запись всегда равна 0, а затем взять cumsum из score и игнорировать последнюю запись.

library(dplyr)

df %>%
  group_by(round_id) %>%
  mutate(cum_score = c(0, head(cumsum(score), -1)))


#  round_id score_id hole_number score cum_score
#     <int>    <int>       <int> <int>     <dbl>
#1        1      100           1     4         0
#2        1      101           2     5         4
#3        1      102           3     4         9
#4        1      103           4     4        13
#5        2      150           1     6         0
#6        2      151           2     4         6

data

df <- structure(list(round_id = c(1L, 1L, 1L, 1L, 2L, 2L), score_id = 
c(100L,101L, 102L, 103L, 150L, 151L), hole_number = c(1L, 2L, 3L, 4L, 
1L, 2L), score = c(4L, 5L, 4L, 4L, 6L, 4L)), .Names = c("round_id", 
"score_id", "hole_number", "score"), row.names = c(NA, -6L), class = 
"data.frame")
...