有条件地删除具有多个引用的行

  • 本文关键字:引用 删除 有条件 r
  • 更新时间 :
  • 英文 :


如果该列有"ClearPrevious",我想删除整行本身及以上。但是,我对多个顺序的"ClearPrevious"有问题,这使事情变得有点复杂。

输入:

 tmp <- data.frame(V1 = c("event1", "ClearPrevious", "event2", "event3", "event4", "ClearPrevious", "ClearPrevious", "event5"))

我的输出:

1 event2
2 event3
3 event5

期望输出:

1 event2
2 event5

我的不成功尝试代码:

row_delete <- c(which(tmp$V1 == "ClearPrevious"))
row_to_be_deleted <- c(row_delete-1)
View(tmp[-c(row_to_be_deleted, row_delete),])

这是我尝试过的:

rm(list=ls())
tmp <- data.frame(V1 = c("event1", "ClearPrevious", "event2", "event3", 
                         "event4", "ClearPrevious", "ClearPrevious", "event5"),
                  stringsAsFactors = F)
while(any(grep('ClearPrevious', tmp$V1)))
{
  clearindex <- which(tmp$V1 == 'ClearPrevious')
  event_index <- grep('event', tmp$V1)
  toremove <- intersect(clearindex-1, event_index)
  V1 <- tmp[-c(toremove, toremove+1),]
  tmp <- as.data.frame(V1)
}
tmp
# event2
# event5

一种方法可以做到这一点:

mutate(tmp,m=`length<-`(V1[-1],nrow(tmp)))%>%
     with(V1[(!m=="ClearPrevious"|is.na(m))&!V1=="ClearPrevious"])
[1] event2 event3 event5
fun=function(s) {
  while(any(grepl("ClearPrevious",s)))
    s=trimws(gsub("\w+\s+ClearPrevious","",paste(s,collapse = " ")))
  strsplit(s,"\s+")[[1]]
}
fun(tmp$V1)
[1] "event2" "event5"

最新更新