R语言data.table中使用str_match处理列结果异常,如何修正?
问题解决方法
你的问题出在对str_match返回结果的索引逻辑上:str_match接收向量输入时,会返回一个行数等于输入向量长度、列数等于匹配组数量+1的矩阵。你用[1, 2]只提取了矩阵第一行第二列的结果,然后data.table把这个单一值重复赋值给了所有行,所以才会出现所有y都是"b"的情况。
修复方法(最直接高效)
直接提取矩阵的第二列,不需要指定行号,这样每个元素对应每行的匹配结果:
library(data.table) library(stringr) pattern.1 <- regex("(?<=a)(.*)(?=c)") DT <- data.table(x = c("abc", "adc", "abd")) DT[, y := str_match(x, pattern.1)[, 2]] DT
运行结果就是你预期的:
x y 1: abc b 2: adc d 3: abd <NA>
另一种逐行处理的方式(适合复杂场景)
如果需要更灵活的逐行处理,可以用lapply或者purrr的映射函数,不过对于这个场景来说上面的方法足够高效:
library(purrr) DT[, y := map_chr(x, function(val) str_match(val, pattern.1)[, 2])]
内容的提问来源于stack exchange,提问作者Ian Wang
相关产品推荐
相关产品推荐

