2017-09-23 41 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))