如果字符串包含任何单词列表,则R每行返回true或false

nog*_*bad 4 string r dataframe

我有一个包含一列字符串的数据集:

text <- c('flight cancelled','dog cat','coach travel','car bus','cow sheep',' high bar')
transport <- 0

 df <- data.frame(text,transport)
Run Code Online (Sandbox Code Playgroud)

如果字符串'text'包含多个单词中的任何一个,我想为每一行返回1,否则返回0。我的问题是我能想到的唯一方法是使用for循环。有更有效的方法吗?我的数据集非常大,因此for循环永远需要运行

words<- 'flight|flights|plane|seats|seat|travel|time|coach'

for (i in 1:6){
   df$transport[i] <- ifelse(any(grepl(words,(str_split(as.character(df$text[i]), " ")))) == TRUE,1,0)
 }
Run Code Online (Sandbox Code Playgroud)

返回:

              text transport
1 flight cancelled         1
2          dog cat         0
3     coach travel         1
4          car bus         0
5        cow sheep         0
6         high bar         0
Run Code Online (Sandbox Code Playgroud)

GKi*_*GKi 5

您可以使用wordsdf$text直接grep找到要设置为1的行。

df$transport[grep(words, df$text)] <- 1
Run Code Online (Sandbox Code Playgroud)


And*_*rew 5

如果您正在寻找速度,stringr或者stringi函数通常优于基本函数:

library(stringr)

as.integer(str_detect(df$text, words))
[1] 1 0 1 0 0 0
Run Code Online (Sandbox Code Playgroud)

编辑:再注意一点,考虑使用单词边界,这样就不会得到部分匹配(例如,flight单词 的匹配flights

paste0("\\b", gsub("|", "\\b|\\b", words, fixed = T), "\\b") 
[1] "\\bflight\\b|\\bflights\\b|\\bplane\\b|\\bseats\\b|\\bseat\\b|\\btravel\\b|\\btime\\b|\\bcoach\\b"
Run Code Online (Sandbox Code Playgroud)


Cet*_*ttt 3

这是一种可能性:

df <- data.frame(text =  c('flight cancelled','dog cat','coach travel','car bus','cow sheep',' high bar'), 
                 transport = 0)
words <- 'flight|flights|plane|seats|seat|travel|time|coach'


df[grep(words, df$text, value = F), "transport"] <- 1

              text transport
1 flight cancelled         1
2          dog cat         0
3     coach travel         1
4          car bus         0
5        cow sheep         0
6         high bar         0
Run Code Online (Sandbox Code Playgroud)