R中的高级行删除

时间:2015-08-06 05:41:26

标签: r conditional subset delete-row

我希望在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')

我想要做的是删除第一个逻辑标志等于&#39; y&#39;下面每个特定级别的所有行。

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

使用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                   

答案 1 :(得分:2)

使用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

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