基于r中多个条件的循环

Loop based on multiple conditions in r

我有这样的数据集,

       x time 
1   TRUE   10       
2  FALSE   20       
3   TRUE   11       
4  FALSE   10       
5   TRUE   16       
6  FALSE    2       
7   TRUE   17       
8  FALSE    6   
9   TRUE   11       
10 FALSE    7       
11  TRUE   20       
12 FALSE    3       
13  TRUE   10       
14 FALSE    4       
15  TRUE    2       
16 FALSE   10  
17  TRUE    3       
18 FALSE    6 

我想使用 r 生成一个新变量来标记基于 x 和时间的某些条件。具体来说,我想从头开始搜索数据,当“x 为真且 time 长于 15”时,我想找到“x 为 FALSE 且 time 长于 5” 的下一行,并将其标记在新变量中。在整个数据集中重复执行此操作。

我想要得到的输出是这样的。

       x time Marker
1   TRUE   10       
2  FALSE   20       
3   TRUE   11       
4  FALSE   10       
5   TRUE   16       
6  FALSE    2       
7   TRUE   17       
8  FALSE    6   Meet
9   TRUE   11       
10 FALSE    7       
11  TRUE   20       
12 FALSE    3       
13  TRUE   10       
14 FALSE    4       
15  TRUE    2       
16 FALSE   10   Meet
17  TRUE    3       
18 FALSE    6 

我正在考虑在 r 中循环执行此操作,因为我有一个很长的数据集,但无法解决这个问题。如有任何建议,我们将不胜感激。

假设您的 data.frame 被称为 d

look <- FALSE
d$Marker <- NA
for(i in 1:nrow(d)){
  if(d$x[i] & d$time[i] > 15){
    look <- TRUE
    next
  }
  if(look){
    if(!d$x[i] & d$time[i] > 5){
      d$Marker[i] <- "Meet"
      look <- FALSE
    }
  }
}
library(dplyr)

mark_first <- function(x) {
  out <- rep('', length(x))
  if (!any(x)) return(out)
  out[which.max(x)] <- "Meet"
  return(out)
}

d %>% 
  group_by(g = cumsum(x & (time > 15))) %>% 
  mutate(Marker = mark_first(!x & time < 5))
# A tibble: 18 × 4
# Groups:   g [4]
   x      time     g Marker
   <lgl> <int> <int> <chr> 
 1 TRUE     10     0 ""    
 2 FALSE    20     0 ""    
 3 TRUE     11     0 ""    
 4 FALSE    10     0 ""    
 5 TRUE     16     1 ""    
 6 FALSE     2     1 "Meet"
 7 TRUE     17     2 ""    
 8 FALSE     6     2 ""    
 9 TRUE     11     2 ""    
10 FALSE     7     2 ""    
11 TRUE     20     3 ""    
12 FALSE     3     3 "Meet"
13 TRUE     10     3 ""    
14 FALSE     4     3 ""    
15 TRUE      2     3 ""    
16 FALSE    10     3 ""    
17 TRUE      3     3 ""    
18 FALSE     6     3 ""