R中的高级行删除

advanced row deleting in R

我希望根据高级选择逻辑(即不仅仅是一个简单的子集)在 R 中删除行。这是一些示例代码和我需要做的事情

v1 <- c(1:11)
v2 <- c('a','a','b','b','b','b','c','c','c','c','c')
v3 <- c(3,13,14,13,14,9,14,13,14,13,14)
v4 <- c('','x','','','','x','','','','','x')
v5 <- c('','x','','y','','x','','y','','y','x')

test.df <- data.frame(v1,v2,v3,v4,v5)
names(test.df) <- c('id','level','number','end_flag','logic_flag')

我想要做的是删除第一个逻辑标志等于 'y'.

下面每个特定级别的所有行

所以在这种情况下,最终结果应该不会删除级别 a 的任何行、级别 b 的第 5 和 6 行以及级别 c 的第 9、10、11 行。

基本上,想要使 end_flag 每个级别的数字列中出现的第一个“13”等于 'x',然后删除 'x' 下该级别的所有行=24=] = 'x' 让我知道这是否有意义,因为我需要在继续我的其余代码之前清理这部分!

谢谢!

使用dplyr你可以做到

library(dplyr)
test.df %>% group_by(level) %>%
  filter(head(cumsum(c(F, logic_flag == 'y')) == 0, -1))
#   id level number end_flag logic_flag
# 1  1     a      3                    
# 2  2     a     13        x          x
# 3  3     b     14                    
# 4  4     b     13                   y
# 5  7     c     14                    
# 6  8     c     13                   y

首先,按级别分组,然后删除我们已经看到 "y" 的行(使用 cumsum)。 F 附加到 cumsum 向量,因为我们想要包括包含 "y" 的第一行。由于向量的长度增加了 1,因此 head(..., -1) 用于删除最后一个元素。我认为 dplyr 有一些 lag 函数也可以做类似的事情。

Base R 使用 cumsum 两次:

posty <- function(x) cumsum(cumsum(x))<=1
test.df[with(test.df, ave(logic_flag=="y", level, FUN=posty)),]

#  id level number end_flag logic_flag
#1  1     a      3                    
#2  2     a     13        x          x
#3  3     b     14                    
#4  4     b     13                   y
#7  7     c     14                    
#8  8     c     13