!grepl in for循环从数据帧中删除行

时间:2017-09-23 02:33:27

标签: r

我想使用for循环来删除包含另一个向量中的值的文本字符串的任何行。我知道我可以使用正则表达式,但这是一个我经常重复的过程,所以我想将一个术语向量传递给一个循环,然后是一个更大的函数来节省时间。

# Dataframe that always changes
keyword <- c('acme regulator','regulator','brand regulator')
position <- c(1, 23, 3)

# Terms I want to remove that always change
rmterms <- c('acme','brand')

t_allkwsum <- data.frame(keyword, position)

df <- for (i in 1:length(rmterms)){
     x <- t_allkwsum[!grepl(rmterms[i],t_allkwsum$keyword),]
     df2 <- rbind(df2,x)
     }

df返回NULL。我希望它返回任何一行“rmterms&#39;值不存在于t_allkwsum $ keyword中。

3 个答案:

答案 0 :(得分:0)

df[-which(rowSums(sapply(rmterms,
function(t,df){!grepl(pattern = t,x = df$keyword)},df))!=length(rmterms)),]

#keyword position
#2 regulator       23

答案 1 :(得分:0)

不太清楚您想要的输出。但是,如果你想保留你提供的代码的结构,你可以在if condition中使用for loop,如下所示,这将返回一个'rmterms'值不是出现在't_allkwsum $ keyword'。

keyword <- c('acme regulator','regulator','brand regulator')
position <- c(1, 23, 3)

# Terms I want to remove that always change
rmterms <- c('acme','brand')

t_allkwsum <- data.frame(keyword, position)

list1 <- list()
j = 0
for (i in 1:length(rmterms)){
   if (grepl(rmterms[i],t_allkwsum$keyword) == FALSE) {
      j = j + 1
      list1[[j]] <- t_allkwsum[i,]
   } 
}
df2 <- do.call(rbind, list1)

df2
keyword position
2 regulator       23

但是,我不认为使用条件和for循环是计算明智的好主意。

答案 2 :(得分:0)

在dplyr版本中:

t_allkwsum %>% filter(!grepl(paste(rmterms, collapse="|"), keyword))