2017-07-14 75 views
0

功能是否与正则表达式匹配,我想使用匹配值填充新功能,否则NA。基于正则表达式和正则表达式值改变数据框

我发现this后,试图用我的问题的答案。

library(dplyr) 
library(stringr) 

dat.p <- dat.p %>% 
    mutate(
    cad = ifelse(str_locate(text_field, "\\[[^]]*\\]"), 
       str_extract(text_field, "\\[[^]]*\\]"), 
       NA) 
    ) 

在哪里,如果有text_field内的匹配正则表达式\\[[^]]*\\]使用新列CAD该值,否则使CAD NA值。

当我运行它,我得到错误:

Error: wrong result size (1000000), expected 500000 or 1 

我该怎么办呢?

一些示例数据:

df <- data.frame(
    id = 1:2, 
    sometext = c("[cad] apples", "bannanas") 
) 

df.desired <- data.frame(
    id = 1:2, 
    sometext = c("[cad] apples", "bannanas"), 
    cad = c("[cad]", NA) 
) 

回答

3

我不知道为什么你发生变异和ifelse打扰时,其使用的事实,str_extract会给你一个NA如果没有提取一个衬垫:

> df$cad = str_extract(df$sometext,"\\[[^]]*\\]") 
> df 
    id  sometext cad 
1 1 [cad] apples [cad] 
2 2  bannanas <NA> 

您可以通过单独尝试表达式并查看会发生什么来调试R.例如,您ifelse的第一个元素是这样的:

> str_locate(df$sometext,"\\[[^]]*\\]") 
    start end 
[1,]  1 5 
[2,] NA NA 

这显然不会为ifelse的第一个参数来工作。那么为什么你认为它呢?

2
> df$cad <- regmatches(df$sometext, gregexpr("\\[[^]]*\\]", df$sometext)) 
> df 
    id  sometext cad 
1 1 [cad] apples [cad] 
2 2  bannanas 
+0

给你+1使用基地,但后来意识到你没有设置错过匹配NA ... – Spacedman