使用与 R rule() 中零和一的出现顺序相关的多个条件提取行

Extract rows using multiple conditions related to the order of occurrence of zero and one in R rule()

我有一个示例数据集,我想根据与 0 和 1 相关的几个条件提取它。这是示例数据。

df <- data.frame(ID=c(60,60,60,60,60,60,60,60,60,60,61,61,61,61,61,61,61,61,61,61), var=c("X1", "X2","X3", "X4", "X5","X6","X7","X8","X9","X10","X1", "X2","X3", "X4", "X5","X6","X7","X8","X9","X10"), 
                 zero=c(0,0,NA,NA,NA,0,NA,0,NA,NA,NA,NA,NA,0,NA,0,NA,NA,NA,0), pos=c(NA,NA,1,1,NA,NA,1,NA,1,NA,1,NA,1,NA,1,NA,NA,1,1,NA))
ID var zero pos
60 X1 0 NA
60 X2 0 NA
60 X3 NA 1
60 X4 NA 1
60 X5 NA NA
60 X6 0 NA
60 X7 NA 1
60 X8 0 NA
60 X9 NA 1
60 X10 NA NA
61 X1 NA 1

在每个 ID (60,61) 中,我想根据列名 'zero' 和 'pos' 中的变量提取行。第一个条件是,我想提取第一次出现 1 和最后一次出现 1 的行。其次,我想提取在第一次出现 1 之前具有零的行。第三,我想提取零行在第一次出现 1 之后发生。最后,我想用 0 或 1 提取最后一行。

因此,结果 table 看起来像这样。

df2 <- data.frame(ID=c(60,60,60,60,61,61,61,61), var=c("X2","X3","X6","X9","X1", "X4","X9","X10"), 
                 zero=c(0,NA,0,NA,NA,0,NA,0), pos=c(NA,1,NA,1,1,NA,1,NA))
ID var zero pos
60 X2 0 NA
60 X3 NA 1
60 X6 0 NA
60 X9 NA 1
61 X1 NA 1
61 X4 0 NA
61 X9 NA 1
61 X10 0 NA

我尝试使用 rle() 和 match 但我没有成功。 请如果有人熟悉像这样提取数据。我将不胜感激。 提前谢谢你。

您可以创建一个反映您的四个条件的小函数,然后按组应用该函数

f <- function(z,p) {
  p1 = which(p==1)
  z0 = which(z==0)
  c1 = c(p1[1],p1[length(p1)])
  c2 = ifelse(z[p1[1]-1]==0, as.integer(p1[1]-1),as.integer(NA))
  c3 = min(z0[which(z0>p1[1])], na.rm=T)
  c4 = max(p1,z0, na.rm=T)
  unique(c(c1,c2,c3,c4))
}

现在,按组应用该功能

libary(dplyr)
df %>%
  group_by(ID) %>%
  filter(row_number() %in% f(zero,pos))

输出:

     ID var    zero   pos
  <dbl> <chr> <dbl> <dbl>
1    60 X2        0    NA
2    60 X3       NA     1
3    60 X6        0    NA
4    60 X9       NA     1
5    61 X1       NA     1
6    61 X4        0    NA
7    61 X9       NA     1
8    61 X10       0    NA

或者,使用 data.table

library(data.table)
setDT(df)[, .SD[f(zero,pos)], by=ID]

输出:

      ID    var  zero   pos
   <num> <char> <num> <num>
1:    60     X3    NA     1
2:    60     X9    NA     1
3:    60     X2     0    NA
4:    60     X6     0    NA
5:    61     X1    NA     1
6:    61     X9    NA     1
7:    61     X4     0    NA
8:    61    X10     0    NA