在R中使用SUBSTR/GREP从列中提取字符串列表?



我知道以前有人问过这个问题,我一直在努力使逻辑适应我的情况,但我不确定我做错了什么。

我有一个数据框架,我试图根据另一列中的元素是否有我正在搜索的字符串来创建一个新的True/False列。

cpt <- data.frame(value = c("62267", "62268", "62269"))
ex <- data.frame(code = c("2456", "62267", "6200", "62268", "63001", "62269"))

当ex中的字符串等于cpt中的字符串时,我想要一个true

我试过了:

cpt1 <- paste(cpt, collapse = '|')
setDT(ex)[,i4 := str_extract(ex$code, cpt)]

setDT(ex)[,i3 := sapply(cpt1, grepl, ex$code)] 

setDT(ex)[,i2 := any(grep(cpt1,ex$code))]

but my "i"列总是显示为NULL。我想继续使用数据。表包,因为我在这个代码片段后面有链。我不确定我做错了什么?任何帮助/建议将非常感激!

我们需要从vector而不是data.frame中创建模式,即提取列'value'和paste

library(data.table)
library(stringr)
cpt1 <- paste(cpt$value, collapse = '|')
setDT(ex)[, i4 := str_extract(code, cpt1)]
ex[, i3 := sapply(cpt1, grepl, code)]
ex[, i2 := any(grepl(cpt1, code))]

与产出

ex
code    i4    i3   i2
1:  2456  <NA> FALSE TRUE
2: 62267 62267  TRUE TRUE
3:  6200  <NA> FALSE TRUE
4: 62268 62268  TRUE TRUE
5: 63001  <NA> FALSE TRUE
6: 62269 62269  TRUE TRUE

TRUE/FALSE列也可以使用data.table包中的%chin%函数生成。它基本上检查左边的每个元素(字符串)是否出现在右边。

setDT(ex)[, i := code %chin% cpt$value]
#      code      i
# 1:   2456  FALSE
# 2:  62267   TRUE
# 3:   6200  FALSE
# 4:  62268   TRUE
# 5:  63001  FALSE
# 6:  62269   TRUE

最新更新