我有一个数据框,我想做一些复杂的过滤。序贯 以下是我的数据框的示例:
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
我要做的是在玩家从Year
更改为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()
但是我得到了这个输出,这不是我想要的:
Name Year Difference_IP Position Position_num
1 Aaron Heilman 2005 24.0 RP 1
2 Aaron Heilman 2003 -62.0 SP 2
3 Aaron Laffey 2012 -71.8 SP 2
4 Aaron Laffey 2010 5.2 RP 1
Team Start-IP Relief-IP
1 Mets 42.0 66.0
2 Mets 63.2 1.2
3 Blue Jays 86.0 14.2
4 Indians 25.0 30.2
我每次尝试考虑它的方式都是每次RP
到SP
或SP
到RP
之间都有一个序列Year
到下一个,那就是我要保留的数据。
有人知道怎么做吗?非常感谢所有帮助。
答案 0 :(得分:1)
我们可以使用lag
和lead
为filter
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