按组进行条件子集

Emi*_*ily 2 r

示例数据:

mydf<-data.frame(Group_ID=c("337", "337", "201", "201", "470", "470", "999", "999"), 
                              Timestamp=c("A", "A", "B", "B", "C", "D", "E", "F"), 
                              MU=as.numeric(c("1", "1", "2", "3", "4", "4", "5", "6")))
Run Code Online (Sandbox Code Playgroud)

给出:

    Group_ID Timestamp MU
         337         A  1
         337         A  1
         201         B  2
         201         B  3
         470         C  4
         470         D  4
         999         E  5
         999         F  6
Run Code Online (Sandbox Code Playgroud)

如果 MU 大于 1,我只想保留 Group_ID 中的第一个条目。如果 MU <= 1,我想保留该组的所有条目。因此,

想要的结果:

    Group_ID Timestamp MU
         337         A  1
         337         A  1
         201         B  2
         470         C  4
         999         E  5
Run Code Online (Sandbox Code Playgroud)

我做了很多尝试,最接近的是下面的例子。但是,此解决方案是错误的,因为它排除了 MU <= 1 的所有条目。

最佳尝试:

mydf <- mydf[(mydf$MU >= 1),] %>%            
  group_by(Group_ID) %>% 
  slice(1:1)  
Run Code Online (Sandbox Code Playgroud)

返回不需要的结果(排除而不是保留所有 MU <= 1):

Group_ID Timestamp    MU
     201         B     2
     337         A     1
     470         C     4
     999         E     5
Run Code Online (Sandbox Code Playgroud)

我很惊讶这种尝试不起作用,它缺少什么?我也试过ifelse声明。提前谢谢了

d.b*_*d.b 5

mydf %>%
    group_by(Group_ID) %>%
    filter(cumsum(MU > 1) <= 1) %>%
    ungroup()
## A tibble: 5 x 3
#  Group_ID Timestamp    MU
#  <fct>    <fct>     <dbl>
#1 337      A             1
#2 337      A             1
#3 201      B             2
#4 470      C             4
#5 999      E             5
Run Code Online (Sandbox Code Playgroud)

基本 R 等价物将是

mydf[with(mydf, ave(MU > 1, Group_ID, FUN = cumsum) <= 1),]
Run Code Online (Sandbox Code Playgroud)