在Databricks中用R检测目标词重复并输出二进制值
问题:检测字符串中目标词是否重复出现(Databricks R环境)
在Databricks环境中用R处理数据,现有目标词列表:
extract <- c("codeine", "tramadol", "fentanyl", "morphine")
需要判断字符串(比如示例"codeine with fentanyl oral")里有没有任一目标词重复出现,在新列返回1(有重复)或0(无重复)的二进制结果。试了三种方法都没完全解决问题:
尝试过的方法
- 方法1:
df$testvar1 <- +(str_count(df$medname, fixed(extract))> 1)
- 方法2:
df$testvar2 <- cSplit_e(df$medname, split.col = "String", sep = " ", type = "factor", mode = "binary", fixed = TRUE, fill = 0)
- 方法3:
df$testvar3 <- str_extract_all(df$medname, paste(extract, collapse = " "))
可行解决方案
先说说之前方法的问题:
- 方法1:
str_count搭配fixed(extract)会把整个目标词向量当成一个整体匹配,没法逐个统计每个词的出现次数。 - 方法2:
cSplit_e只是拆分字符串生成二进制列,没法直接判断单个目标词是否重复出现。 - 方法3:把目标词拼成空格分隔的字符串后,
str_extract_all只会匹配这个整体,没法分别统计每个词的出现次数。
方案1:逐个统计目标词出现次数
用stringr包的str_count循环检查每个目标词,只要有一个词出现超过1次就返回1:
library(stringr) # 定义检查单个字符串的函数 has_repeat_target <- function(str, targets) { # 统计每个目标词的出现次数,只要有一个>1就返回TRUE any(str_count(str, fixed(targets)) > 1) } # 给数据框添加结果列 df$has_repeat <- +sapply(df$medname, has_repeat_target, targets = extract)
方案2:拆分单词后统计词频(精确匹配完整单词)
如果需要避免部分匹配(比如不想把"codeines"当成"codeine"),可以先拆分字符串为单词,再筛选目标词统计次数:
library(stringr) library(dplyr) df <- df %>% mutate( # 按空格拆分字符串成单词列表 med_word_list = str_split(medname, "\\s+"), # 检查列表中是否有目标词重复出现 has_repeat = +sapply(med_word_list, function(words) { target_hits <- intersect(words, extract) any(table(target_hits) > 1) }) ) %>% select(-med_word_list) # 可选:删除中间生成的列
内容的提问来源于stack exchange,提问作者db2020
相关产品推荐
相关产品推荐

