我知道以前有人问过这个问题,我一直在努力使逻辑适应我的情况,但我不确定我做错了什么。
我有一个数据框架,我试图根据另一列中的元素是否有我正在搜索的字符串来创建一个新的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