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)
您可以使用words并df$text直接grep找到要设置为1的行。
df$transport[grep(words, df$text)] <- 1
Run Code Online (Sandbox Code Playgroud)
如果您正在寻找速度,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)
这是一种可能性:
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)