我想使用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中。
答案 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))