我试图仅提取满足特定条件的字符串的一部分。我有一个由1、2或3个值组成的列,其中包含一个类似部分的字符串,例如
c( " apa1 ghg2 PA0134", "qrz3 PA2858", "PA5103", "gan3 jgr3 PA4301").
我只想从字符串中收集PAxxxx
值,或者将其分成3列,但其中只有一个PAxxxx
值。
我尝试使用gsub
的各种化身来分隔或子字符串。但是这些都依赖于一致的长度或条目数。任何开始都会有所帮助。
答案 0 :(得分:2)
这是str_extract
中stringr
的一个选项。指定单词边界(\\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中使用regmatches
和regexpr
来做到这一点:
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")