在特定行之后过滤数据

时间:2018-09-17 09:50:31

标签: r

我有一个像这样的数据集:

      id    type    value
1    001     0      1991
2    001     0      1992
3    001     1      1993
4    001     1      1994
5    002     1      1992
6    002     1      1993
7    003     0      1999
8    003     1      2000
9    003     0      2001

我想先选择类型等于1的数据集中的行。

最终预期结果应如下:

      id    type    value


3    001     1      1993
4    001     1      1994
5    002     1      1992
6    002     1      1993

8    003     1      2000
9    003     0      2001

我知道首先按id将其分组。但是我不知道下一步。

有人有什么建议吗?

2 个答案:

答案 0 :(得分:2)

使用dplyr

library(dplyr)
df %>% 
  group_by(id) %>% 
  mutate(sel = cumsum(type)) %>% 
  filter(sel > 0) %>% 
  select(id, type, value)

结果:

# A tibble: 6 x 3
# Groups:   id [3]
     id  type value
  <int> <int> <int>
1     1     1  1993
2     1     1  1994
3     2     1  1992
4     2     1  1993
5     3     1  2000
6     3     0  2001

以R为底

df[with(df, ave(type, id, FUN = cumsum)) > 0, ]

答案 1 :(得分:1)

您可以为数据的子集分配值,其中每组cumsum的{​​{1}}等于或大于1(当然也大于0)。

id

base R

使用idx <- as.logical(with(DF, ave(type, id, FUN = function(x) cumsum(x) >= 1))) DF[idx, ] # id type value #3 1 1 1993 #4 1 1 1994 #5 2 1 1992 #6 2 1 1993 #8 3 1 2000 #9 3 0 2001 see this post

data.table

数据

library(data.table)
setDT(DF)[DF[, .I[cumsum(type) > 0], by = id]$V1]