对其他列 R 的条件划分

Conditional division on other columns R

我正在尝试在下面的数据框中创建 3 个额外的列,这些列计算一个候选人相对于​​另一个候选人的百分比胜利幅度、候选人的投票份额和一个虚拟变量 1/0 表示胜利与否,所有每个部分每个州的城市。

我的数据框:

State City Vote Section Candidat
 MA     A    53     1       Joe
 MA     A    39     1       Tom
 MA     A    26     2       Tom
 MA     A    29     2       Joe
 MA     B    12     1       Tim
 MA     B    10     1       Ben
 MA     B    16     2       Tim
 MA     B    13     2       Ben
 CH     C    88     1       Liz
 CH     C    65     1       Alex
 CH     C    71     1       Aziz
 CH     C    23     2       Aziz
 CH     C    30     2       Alex
 CH     C    19     2       Liz

所需的数据帧

State City Vote Section Candidat Margin Share Elect
 MA     A    53     1       Joe   0.36   0.58   1
 MA     A    39     1       Tom  -0.36   0.42   0
 MA     A    26     2       Tom  -0.10   0.47   0
 MA     A    29     2       Joe   0.10   0.53   1
 MA     B    12     1       Tim   0.20   0.55   1
 MA     B    10     1       Ben  -0.20   0.45   0
 MA     B    16     2       Tim   0.23   0.55   1
 MA     B    13     2       Ben  -0.23   0.45   0
 CH     C    88     1       Liz   0.35   0.58   1
 CH     C    65     1       Alex -0.35   0.42   0
 CH     C    71     1       Aziz  2.09   0.76   1
 CH     C    23     2       Aziz -2.09   0.24   0
 CH     C    30     2       Alex  0.58   0.61   1
 CH     C    19     2       Liz  -0.58   0.39   0

你可以使用

library(dplyr)


df %>% 
  group_by(State, City, Section) %>% 
  mutate(
    Margin = ifelse(Vote == max(Vote), max(Vote) / min(Vote) - 1, 1 - max(Vote) / min(Vote)),
    Share = Vote / sum(Vote),
    Elect = +(Vote == max(Vote))
  ) %>% 
  ungroup()

这个returns

# A tibble: 14 x 8
   State City   Vote Section Candidat Margin Share Elect
   <chr> <chr> <dbl>   <dbl> <chr>     <dbl> <dbl> <int>
 1 MA    A        53       1 Joe       0.359 0.576     1
 2 MA    A        39       1 Tom      -0.359 0.424     0
 3 MA    A        26       2 Tom      -0.115 0.473     0
 4 MA    A        29       2 Joe       0.115 0.527     1
 5 MA    B        12       1 Tim       0.2   0.545     1
 6 MA    B        10       1 Ben      -0.2   0.455     0
 7 MA    B        16       2 Tim       0.231 0.552     1
 8 MA    B        13       2 Ben      -0.231 0.448     0
 9 CH    C        88       1 Liz       0.354 0.393     1
10 CH    C        65       1 Alex     -0.354 0.290     0
11 CH    C        71       1 Aziz     -0.354 0.317     0
12 CH    C        23       2 Aziz     -0.579 0.319     0
13 CH    C        30       2 Alex      0.579 0.417     1
14 CH    C        19       2 Liz      -0.579 0.264     0