2017-09-23 44 views
1

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

# 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。我希望它返回t_allkwsum $关键字中不存在'rmterms'值的任何行。

+1

't_allkwsum [!grepl(粘贴(rmterms,塌陷= '|'),t_allkwsum $关键字),]'这是你想要 – rawr

+0

回报什么是预期的输出目前尚不清楚。 – TUSHAr

回答

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

#keyword position 
#2 regulator  23 
0

不太清楚你想要什么作为输出。但是,如果您希望保留您提供的代码结构,则可以在下面的for loop中使用if condition,这会返回给您'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 

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

0

在dplyr版本:

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