我希望在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;下删除该级别的所有行 让我知道这是否有意义,因为我需要在继续我的其余代码之前清理这个部分!
谢谢!
答案 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
函数也可以做类似的事情。