尝试有条件地将字符串的子部分提取到新列中

时间:2019-04-16 19:08:26

标签: r regex substring

我试图仅提取满足特定条件的字符串的一部分。我有一个由1、2或3个值组成的列,其中包含一个类似部分的字符串,例如

c( " apa1 ghg2 PA0134", "qrz3 PA2858", "PA5103", "gan3 jgr3 PA4301").

我只想从字符串中收集PAxxxx值,或者将其分成3列,但其中只有一个PAxxxx值。

我尝试使用gsub的各种化身来分隔或子字符串。但是这些都依赖于一致的长度或条目数。任何开始都会有所帮助。

2 个答案:

答案 0 :(得分:2)

这是str_extractstringr的一个选项。指定单词边界(\\b),后跟子字符串“ PA”和一个或多个字符

library(stringr)
str_extract(v1, "\\bPA\\w+")
#[1] "PA0134" "PA2858" "PA5103" "PA4301"

如果我们想作为一列,则可以使用read.csv中的base R分成两列

read.csv(text = sub("\\b(PA)", ",\\1", v1), 
        header = FALSE, stringsAsFactors = FALSE)
#          V1     V2
#1 apa1 ghg2  PA0134
#2      qrz3  PA2858
#3            PA5103
#4 gan3 jgr3  PA4301

数据

v1 <- c("apa1 ghg2 PA0134", "qrz3 PA2858", "PA5103", "gan3 jgr3 PA4301")

答案 1 :(得分:2)

我们可以在Base R中使用regmatchesregexpr来做到这一点:

regmatches(x, regexpr("\\bPA.+\\b", x))
# [1] "PA0134" "PA2858" "PA5103" "PA4301"

使用gregexpr,我们得到一个列表:

regmatches(x, gregexpr("\\bPA.+\\b", x))
# [[1]]
# [1] "PA0134"
# 
# [[2]]
# [1] "PA2858"
# 
# [[3]]
# [1] "PA5103"
# 
# [[4]]
# [1] "PA4301"

或者如果需要,请使用tidyr:extract

library(dplyr)
library(tidyr)

tibble(x) %>%
  extract(x, c("v1", "v2", "v3"), "\\b(\\w*)\\s?(\\w*)\\s?(PA\\w+)\\b", remove = FALSE)

输出:

# A tibble: 4 x 4
  x                v1    v2    v3    
  <chr>            <chr> <chr> <chr> 
1 apa1 ghg2 PA0134 apa1  ghg2  PA0134
2 qrz3 PA2858      qrz3  ""    PA2858
3 PA5103           ""    ""    PA5103
4 gan3 jgr3 PA4301 gan3  jgr3  PA4301

数据:

x <- c("apa1 ghg2 PA0134", "qrz3 PA2858", "PA5103", "gan3 jgr3 PA4301")