r - 使用 dplyr 计算数据列中的 "streaks"

标签 r dplyr data-manipulation

我认为标题没有清楚地解释我需要做的数据计算,所以我在下面创建了一个简单的可重现示例:

这是输入数据框

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

...然而,这并没有真正让我到达我需要去的地方...

最佳答案

这是一种方法:

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

关于r - 使用 dplyr 计算数据列中的 "streaks",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674176/

相关文章:

r - Hmisc 之后加载 tidyverse 时出现评估错误

r - 如何通过 http 共享 'r' 图

r - 如何在 R 中对数据框进行排序

r - 如果满足条件,则用向量填充列

r - 使用 Shiny 的文本输入和 dplyr 来过滤数据框中的行

r - 如何对 dplyr-R 中的多个数据帧应用相同的操作?

r - 根据条件传播到宽格式

r - 在 ggplot2 中使用 bquote 折叠字幕

r - 将 mm-yy 字符串 "Jan-01"转换为日期格式

r - 将多个数据帧列映射到 R 中的百分位值时处理 NA