我认为标题没有清楚说明我需要做的数据计算,因此我在下面创建了一个简单的可重现示例:
这是输入数据框
structure(list(homePoints = c(0, 0, 0, 0, 0, 0, 0,
0, 0, 2, 2, 4, 4, 4, 4, 4, 4, 5), awayPoints = c(0,
0, 0, 0, 0, 1, 2, 2, 2, 2, 5, 5, 8, 8, 8, 10, 10, 10), homeMargin = c(0,
0, 0, 0, 0, -1, -2, -2, -2, 0, -3, -1, -4, -4, -4, -6, -6, -5
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-18L))
# A tibble: 18 x 3
homePoints awayPoints homeMargin
<dbl> <dbl> <dbl>
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0
5 0 0 0
6 0 1 -1
7 0 2 -2
8 0 2 -2
9 0 2 -2
10 2 2 0
11 2 5 -3
12 4 5 -1
13 4 8 -4
14 4 8 -4
15 4 8 -4
16 4 10 -6
17 4 10 -6
18 5 10 -5
我只是试图获得以下“本垒打”的输出:
c(-2, 2, -3, 2, -5, 1)
输出说明-客队以2分(在第6和7行中分别获得1分)开始比赛, -2
,然后主队得到2分(第10行) 2
,然后客队得分3分(第11行) -3
,然后主队得分2分(第12行) ) 2
,然后客队获得5分(第13、16行) -5
,然后主队得到1分(第18行) ), 1
。正面条纹正面,负面条纹负面。
最好将这些条纹作为单独的列创建到称为streaks
或类似名称的数据帧上,并将对该数据帧进行过滤(在这种情况下,从18行到6行),而对于哪些行丢失了。
我正在积极地进行这项工作,但由于我在最后一点时间上一直在苦苦挣扎,所以想在这里发表。任何帮助将不胜感激!
编辑:一个特殊的挑战是,我不能简单地在homeMargin列中查找更改,因为页边距的单个更改不等于条纹。相反,条纹涉及沿相同方向的边距连续变化。
Edit2 :到目前为止,我一直在努力:
my_data %>%
dplyr::mutate(streakDirection = c(0, diff(zoo::as.zoo(homeMargin), na.pad = F))) %>%
dplyr::mutate(signChange = c(0, diff(sign(streakDirection))))
...但是,这并不能真正带我去需要去的地方...
答案 0 :(得分:3)
这是一种方法:
points %>%
mutate(change_net = homeMargin - lag(homeMargin, default = 0),
direction = sign(change_net)) %>%
filter(direction != 0) %>%
mutate(streak = cumsum(direction != lag(direction, default = 0))) %>%
count(streak, wt = change_net)
# A tibble: 6 x 2
streak n
<int> <dbl>
1 1 -2
2 2 2
3 3 -3
4 4 2
5 5 -5
6 6 1
答案 1 :(得分:1)
相同的想法,但实现方式有所不同:
my_data %>%
mutate(mdif = c(0 , (diff(homePoints) - diff(awayPoints))),
msgn=sign(mdif)) %>%
filter(mdif!=0) %>%
mutate(mgrp=cumsum((msgn!=lag(msgn, default = 0)))) %>%
group_by(mgrp) %>%
summarise(mdif = sum(mdif)) %>%
pull(mdif)
#> [1] -2 2 -3 2 -5 1