基于R中的顺序值过滤数据

基于R中的顺序值过滤数据,r,dplyr,R,Dplyr,我有一个数据框,我想做一些复杂的过滤。顺序的 以下是我的数据框示例: Name Year Difference_IP Position Position_num 1 Aaron Heilman 2011 35.1 RP 1 2 Aaron Heilman 2010 72.0 RP 1 3 Aaron Heilman 2009 72.1

我有一个数据框,我想做一些复杂的过滤。顺序的 以下是我的数据框示例:

        Name     Year     Difference_IP Position  Position_num
1  Aaron Heilman 2011          35.1       RP            1
2  Aaron Heilman 2010          72.0       RP            1
3  Aaron Heilman 2009          72.1       RP            1
4  Aaron Heilman 2008          76.0       RP            1
5  Aaron Heilman 2007          86.0       RP            1
6  Aaron Heilman 2006          87.0       RP            1
7  Aaron Heilman 2005          24.0       RP            1
8  Aaron Heilman 2003         -62.0       SP            2
9   Aaron Laffey 2012         -71.8       SP            2
10  Aaron Laffey 2011          52.4       RP            1
11  Aaron Laffey 2010           5.2       RP            1
12  Aaron Laffey 2009         -97.0       SP            2
13  Aaron Laffey 2008         -93.2       SP            2
14  Aaron Laffey 2007         -49.1       SP            2
          Team  Start-IP Relief-IP
1  Diamondbacks      0.0      35.1
2  Diamondbacks      0.0      72.0
3          Cubs      0.0      72.1
4          Mets      0.0      76.0
5          Mets      0.0      86.0
6          Mets      0.0      87.0
7          Mets     42.0      66.0
8          Mets     63.2       1.2
9     Blue Jays     86.0      14.2
10        - - -      0.0      52.4
11      Indians     25.0      30.2
12      Indians    109.1      12.1
13      Indians     93.2       0.0
14      Indians     49.1       0.0
我想做的是检查玩家从
SP
变为
RP
或从
RP
变为
SP
时的
年份。以下是预期输出:

        Name     Year     Difference_IP Position  Position_num
7  Aaron Heilman 2005          24.0       RP            1
8  Aaron Heilman 2003         -62.0       SP            2
9   Aaron Laffey 2012         -71.8       SP            2
10  Aaron Laffey 2011          52.4       RP            1
11  Aaron Laffey 2010           5.2       RP            1
12  Aaron Laffey 2009         -97.0       SP            2
           Team  Start-IP Relief-IP
7          Mets     42.0      66.0
8          Mets     63.2       1.2
9     Blue Jays     86.0      14.2
10        - - -      0.0      52.4
11      Indians     25.0      30.2
12      Indians    109.1      12.1
Aaron Heilman从2006-2011年被筛选出的原因是,在这一点上,他的
RP
SP
位置从未改变

我已经尝试了许多方法来获得这个输出,不幸的是,我完全被难倒了。我能得到的最接近的代码是:

df_1 <- df %>% 
      group_by(Name, Position) %>% 
      filter(row_number() == 1 & unique(Position == "RP") | row_number() == n() & unique(Position == "SP")) %>%
      as.data.frame()
我一直试图思考的方式是,每当
RP
SP
SP
RP
之间从一年到下一年都有一个序列,那么这就是我想要保存的数据


有人知道怎么做吗?非常感谢您的帮助

我们可以使用
lag
lead
filter
ing创建逻辑向量

library(dplyr)
df %>%
   group_by(Name) %>%
   filter(Position != lag(Position)| Position != lead(Position))
#           Name  Year Difference_IP Position Position_num      Team `Start-IP` `Relief-IP`
#          <chr> <int>         <dbl>    <chr>        <int>     <chr>      <dbl>       <dbl>
#1 Aaron Heilman  2005          24.0       RP            1      Mets       42.0        66.0
#2 Aaron Heilman  2003         -62.0       SP            2      Mets       63.2         1.2
#3  Aaron Laffey  2012         -71.8       SP            2 Blue Jays       86.0        14.2
#4  Aaron Laffey  2011          52.4       RP            1     - - -        0.0        52.4
#5  Aaron Laffey  2010           5.2       RP            1   Indians       25.0        30.2
#6  Aaron Laffey  2009         -97.0       SP            2   Indians      109.1        12.1
库(dplyr)
df%>%
分组单位(名称)%>%
过滤器(位置!=滞后(位置)|位置!=领先(位置))
#名称年份差异_IP位置_num团队`起始IP``救济IP`
#                                                  
#1 Aaron Heilman 2005 24.0 RP 1大都会42.0 66.0
#2亚伦·海尔曼2003年-62.0标准普尔2大都会63.2 1.2
#3 Aaron Laffey 2012-71.8 SP 2蓝鸟86.0 14.2
#4亚伦·拉菲2011 52.4 RP 1----0.0 52.4
#5 Aaron Laffey 2010 5.2 RP 1印第安人25.0 30.2
#6 Aaron Laffey 2009-97.0 SP 2 109.1 12.1

太棒了!非常感谢你。我们必须仔细阅读
lag
lead
,但这非常有效。
library(dplyr)
df %>%
   group_by(Name) %>%
   filter(Position != lag(Position)| Position != lead(Position))
#           Name  Year Difference_IP Position Position_num      Team `Start-IP` `Relief-IP`
#          <chr> <int>         <dbl>    <chr>        <int>     <chr>      <dbl>       <dbl>
#1 Aaron Heilman  2005          24.0       RP            1      Mets       42.0        66.0
#2 Aaron Heilman  2003         -62.0       SP            2      Mets       63.2         1.2
#3  Aaron Laffey  2012         -71.8       SP            2 Blue Jays       86.0        14.2
#4  Aaron Laffey  2011          52.4       RP            1     - - -        0.0        52.4
#5  Aaron Laffey  2010           5.2       RP            1   Indians       25.0        30.2
#6  Aaron Laffey  2009         -97.0       SP            2   Indians      109.1        12.1