【问题标题】:R: How to create a new binary column out of next row values?R:如何从下一行值中创建一个新的二进制列?
【发布时间】:2019-07-15 15:08:13
【问题描述】:

这是我需要解决的问题:

给定这样的数据框:

Att.team Def.team    Attack  Defense   Type          Goal
A        B           1       1         Organized     1
B        A           1       1         Organized     0
A        B           2       2         Organized     0
B        A           2       2         Fastbreak     1
A        B           3       3         Organized     0
A        B           3       3         Organized     0
A        B           3       3         Organized     0
B        A           3       3         Fastbreak     1
C        D           1       1         Organized     1
D        C           1       1         Organized     0
C        D           2       2         Fastbreak     0
D        C           2       2         Organized     1
C        D           3       3         Organized     0
D        C           3       3         Fastbreak     1

我想添加两列:

  • 跟踪哪些成功的防御(要成功的目标列必须为 0)会导致快攻(因此在下一行中,类型列必须为“快攻”)。让我们将此新列称为 Def.fb

  • 另一个用于跟踪哪些成功的防守确实导致了以进球结束的快攻(因此,在下一行中,类型列必须为“快攻”,进球列必须为“1”)。我们称之为 Def.fb.goal

换句话说,我希望数据框看起来像这样:

Att.team Def.team    Attack  Defense   Type      Goal Def.fb Def.fb.goal
A        B           1       1         Organized 1    0      0
B        A           1       1         Organized 0    0      0
A        B           2       2         Organized 0    1      1
B        A           2       2         Fastbreak 1    0      0
A        B           3       3         Organized 0    1      1
A        B           3       3         Organized 0    1      1
A        B           3       3         Organized 0    1      1
B        A           3       3         Fastbreak 1    0      0
C        D           1       1         Organized 1    0      0
D        C           1       1         Organized 0    1      0
C        D           2       2         Fastbreak 0    0      0
D        C           2       2         Organized 1    0      0
C        D           3       3         Organized 0    1      1
D        C           3       3         Fastbreak 1    0      0

我正在尝试使用滞后和领先功能,但老实说,我不熟悉这些功能,因此无法获得任何结果。

【问题讨论】:

  • 为什么Def.fb 的第 5:7 行是 1?
  • 因为行 5:7、6:7 和 7:7 在列 Defense 上具有相同的值

标签: r dplyr


【解决方案1】:

可以试试:

library(dplyr)

df %>%
  mutate(
    Def.fb = +(Goal == 0 & lead(Type) == 'Fastbreak'),
    Def.fb.goal = +(lead(Goal) == 1 & lead(Type) == 'Fastbreak')
  ) %>%
  group_by_at(vars(1:4)) %>%
  mutate_at(vars(starts_with("Def.fb")), ~ coalesce(+(any(. == 1)), 0L))

输出:

# A tibble: 14 x 8
# Groups:   Att.team, Def.team, Attack, Defense [12]
   Att.team Def.team Attack Defense Type       Goal Def.fb Def.fb.goal
   <fct>    <fct>     <int>   <int> <fct>     <int>  <int>       <int>
 1 A        B             1       1 Organized     1      0           0
 2 B        A             1       1 Organized     0      0           0
 3 A        B             2       2 Organized     0      1           1
 4 B        A             2       2 Fastbreak     1      0           0
 5 A        B             3       3 Organized     0      1           1
 6 A        B             3       3 Organized     0      1           1
 7 A        B             3       3 Organized     0      1           1
 8 B        A             3       3 Fastbreak     1      0           0
 9 C        D             1       1 Organized     1      0           0
10 D        C             1       1 Organized     0      1           0
11 C        D             2       2 Fastbreak     0      0           0
12 D        C             2       2 Organized     1      0           0
13 C        D             3       3 Organized     0      1           1
14 D        C             3       3 Fastbreak     1      0           0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2015-08-01
    • 2021-05-26
    • 1970-01-01
    • 2018-05-07
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多