使用str_extract_all和unnest但从NA中丢失行

时间:2019-06-18 05:13:18

标签: r tidyr stringr

我正在使用str_extract()str_extract_all()来看看正则表达式。有零个,一个或多个结果,因此我想将多个结果unnest()分成多行。由于ab_all中的character(0)(我假设),unnest不会给出输出中的所有行。

library(tidyverse)

my_tbl <- tibble(clmn = c("abcd", "abef, abgh", "xkcd"))

ab_tbl <- my_tbl %>% 
  mutate(ab = str_extract(clmn, "(?<=ab)[:alpha:]*\\b"), 
         ab_all = str_extract_all(clmn, "(?<=ab)[:alpha:]*\\b"), 
         cd = str_extract(clmn, "[:alpha:]*(?=cd)"))

ab_tbl %>% unnest(ab_all, .drop = FALSE)
# A tibble: 3 x 4
  clmn       ab    cd    ab_all
  <chr>      <chr> <chr> <chr> 
1 abcd       cd    ab    cd    
2 abef, abgh ef    NA    ef    
3 abef, abgh ef    NA    gh 

编辑:预期输出:

# A tibble: 3 x 4
  clmn       ab    cd    ab_all
  <chr>      <chr> <chr> <chr> 
1 abcd       cd    ab    cd    
2 abef, abgh ef    NA    ef    
3 abef, abgh ef    NA    gh 
4 xkcd       NA    xk    NA  

在输出中没有给出带有xkccd的行。是与str_extract_all还是不必要的事情有关,还是应该更改我的方法?

1 个答案:

答案 0 :(得分:2)

也许我们可以将0的长度更改为NA,然后执行unnest

library(tidyverse)
ab_tbl %>%
    mutate(ab_all = map(ab_all,  ~ if(length(.x) ==0) NA_character_ else .x)) %>% 
     unnest

注意:假设str_extract中的模式正确