[有一个data.table dt,其中每一行都有一列文字句子(dt $ text)。然后,有一个包含单词的字典(较小的data.table,每行只有一个单词:dict $ word)。
我需要遍历dt中的每个列值,如果句子中有字典中的任何单词,请将值“ 1”放在新的dt列“ Is_in_dict”中。哪个是最快的方法?我知道,我可以使用grepl(“ Search_word,” Text_to_search“,fixed = TRUE)在文本字符串中搜索文本。我尝试执行以下操作:
for (dummy_k in 1:nrow(dt)) {
ifelse(dt[dummy_k, Is_in_dict] != 1,
for (dummy_l in 1:nrow(dict)) {
dt[dummy_k, Is_in_dict] <- ifelse(grepl(dict[dummy_l, word], dt[dummy_k, text], fixed=TRUE), 1, 0)
}
, 0)
}
我收到错误:ans [ypos]
还有,还有比遍历dt和dict更快的方法吗?
在等待任何示例数据之前,我认为您的数据看起来像这样:
数据
dt = data.table(
text = c('cat, dog', 'horse')
)
dict = data.table(
word = c('cat')
)
下面是data.table
解决方案:
代码
dt[, IsInDict := sapply(text, function(x){
strings = unlist(strsplit(x, ', '))
fifelse(sum(strings %in% dict$word) > 0, 1, 0)
})]
代码使用dt$text
分割strsplit()
中的每个句子,并检查其任何单词是否出现在dict$word
中。
结果
> dt
text IsInDict
1: cat, dog 1
2: horse 0
当然,解决方案对dt$text
中的单词如何分隔很敏感-在我的情况下,它们是由', '
分隔的。