类似于在数据帧中第一次出现变量时提取行数据集的例子:
ID grade date
A 1 1/1/2001
A 3 1/2/2002
A 5 2/4/2002
B 4 1/1/2008
B 4 1/1/2010
B 5 1/1/2011
B 5 1/3/2011
B 4 1/5/2011
C 2 1/1/2006
C 5 1/1/2007
C 5 1/1/2008
D 3 1/1/1996
D 5 1/1/1997
D 5 1/1/1999
E 1 1/1/2003
E 3 1/1/2005
E 3 1/1/2007
我想保留每个人的所有条目,直到他们达到5年级,然后在最早提到5年级之后,无论成绩如何都停止。并非所有id都达到了第5阶段,即使它们有多个相同的等级
,它们也应该保持不变。所需输出:
ID grade date
A 1 1/1/2001
A 3 1/2/2002
A 5 2/4/2002
B 4 1/1/2008
B 4 1/1/2010
B 5 1/1/2011
C 2 1/1/2006
C 5 1/1/2007
D 3 1/1/1996
D 5 1/1/1997
E 1 1/1/2003
E 3 1/1/2005
E 3 1/1/2007
我可以使用顺序和过滤器功能,但我不确定如何将这些应用到每个人的5,然后排除之后的任何东西?
多谢
您可以使用slice
获取从1到第一次出现的5的序列,即
library(dplyr)
df %>%
group_by(ID) %>%
slice(1L : first(which(grade == 5)[1]))
# A tibble: 10 × 3
# Groups: ID [4]
ID grade date
<chr> <int> <chr>
1 A 1 1/1/2001
2 A 3 1/2/2002
3 A 5 2/4/2002
4 B 4 1/1/2008
5 B 4 1/1/2010
6 B 5 1/1/2011
7 C 2 1/1/2006
8 C 5 1/1/2007
9 D 3 1/1/1996
10 D 5 1/1/1997
编辑如果你的组没有grade = 5,那么
df %>%
group_by(ID) %>%
mutate(new = which(grade == 5)[1],
new = replace(new, is.na(new), max(row_number()))) %>%
slice(1L : first(new)) %>%
select(-new)
# A tibble: 13 × 4
# Groups: ID [5]
ID grade date
<chr> <int> <chr>
1 A 1 1/1/2001
2 A 3 1/2/2002
3 A 5 2/4/2002
4 B 4 1/1/2008
5 B 4 1/1/2010
6 B 5 1/1/2011
7 C 2 1/1/2006
8 C 5 1/1/2007
9 D 3 1/1/1996
10 D 5 1/1/1997
11 E 1 1/1/2003
12 E 3 1/1/2005
13 E 3 1/1/2007