如何为数据框中的列创建运行总计,但跳过第一次观察?

时间:2018-12-21 14:01:30

标签: r dplyr regression

我正在尝试在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 :(得分:0)

您可以通过多种方式执行此操作。一种方法是确保第一个条目始终为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

数据

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")