如何用data.table记录字符串列col1中XXX首次匹配位置?现有代码存问题
解决data.table中记录字符串首次匹配位置的问题
原代码的核心问题是误用了grep函数:grep返回的是匹配到模式的行索引,而非每个字符串内部的匹配位置;且无匹配时返回空向量,导致赋值长度不匹配报错。
以下是两种可靠的解决方案:
方案一:使用基础R的gregexpr
gregexpr会对每个字符串返回所有匹配位置的向量(无匹配时返回-1),结合sapply提取首个匹配位置,无匹配时设为NA:
library(data.table) # 构造示例数据 data <- data.table(col1 = c("abcXXXdef", "XXXxyz", "nopqrst", "uvwXXXxyzXXX")) # 添加首次匹配位置列 data[, XXX.pos := sapply(gregexpr("XXX", col1, fixed = TRUE), function(x) { ifelse(x[1] == -1, NA_integer_, x[1]) })] # 查看结果 print(data)
输出结果:
col1 XXX.pos 1: abcXXXdef 4 2: XXXxyz 1 3: nopqrst NA 4: uvwXXXxyzXXX 4
方案二:使用stringr包简化操作
如果允许使用stringr包,str_locate可以直接返回每个字符串的首次匹配起始位置,无匹配时自动返回NA,代码更简洁:
library(data.table) library(stringr) data <- data.table(col1 = c("abcXXXdef", "XXXxyz", "nopqrst", "uvwXXXxyzXXX")) data[, XXX.pos := str_locate(col1, fixed("XXX"))[, 1]]
关键说明
- 使用
fixed=TRUE确保模式被当作纯文本匹配,而非正则表达式,既提升性能又避免转义问题 - 用
NA_integer_而非普通NA,保证列类型为整数型,符合data.table的类型一致性要求
内容的提问来源于stack exchange,提问作者isthisthat
相关产品推荐
相关产品推荐

