Извлечение букв между 2-м периодом и 3-м периодом в R - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть этот вектор с именем Identifier:

c("NC.1.OA", "NC.1.OA.0", "NC.1.OA.1", "NC.1.OA.1.a", "NC.1.OA.1.b", 
"NC.1.OA.1.c", "NC.1.OA.2", "NC.1.OA.2.0", "NC.1.OA.3", "NC.1.OA.4"
)

Я бы хотел извлечь OA

Я пробовал:

gsub(".*\\.(.*)\\..*", "\\1", Identifier)

По сути, я хотел бы извлечь текст между вторым и третьим периодами. Если есть только два периода (NC.1.OA), я бы хотел извлечь все после второго периода.

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018
regmatches(Identifier, gregexpr("OA", Identifier))

wrap ?unlist если вам нужен вектор

unlist(
    regmatches(Identifier, gregexpr("OA", Identifier))
)
# [1] "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA"
0 голосов
/ 12 ноября 2018

Повторите (непериоды, за которыми следует период) дважды, затем запишите непериоды, и нужная подстрока находится в этой захваченной группе:

Identifier = c("NC.1.OA", "NC.1.OA.0", "NC.1.OA.1", "NC.1.OA.1.a", "NC.1.OA.1.b", 
"NC.1.OA.1.c", "NC.1.OA.2", "NC.1.OA.2.0", "NC.1.OA.3", "NC.1.OA.4"
)
gsub("(?:[^.]+\\.){2}([^.]+).*", "\\1", Identifier)

Выход:

[1] "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA"

Для уточнения, (?:[^.]+\\.) - это группа, которая соответствует непериодическим символам, а затем одному периоду. {2} после группы означает, что предыдущий токен (группа) повторяется дважды, то есть «непериоды, за которыми следует период, за которыми следуют непериоды, после которых следует период». Затем последний ([^.]+) соответствует как можно большему количеству непериодических символов после второго периода, тем самым сопоставляя непериодические значения между вторым периодом и третьим периодом (или концом строки).

0 голосов
/ 12 ноября 2018

Мы могли бы попробовать stringr тоже:

Identifier = c("NC.1.OA", "NC.1.OA.0", "NC.1.OA.1", "NC.1.OA.1.a", "NC.1.OA.1.b", 
               "NC.1.OA.1.c", "NC.1.OA.2", "NC.1.OA.2.0", "NC.1.OA.3", "NC.1.OA.4"
)
library(stringr)
str_extract(Identifier, ".OA.")
# [1] NA     ".OA." ".OA." ".OA." ".OA." ".OA." ".OA." ".OA." ".OA." ".OA."
str_extract(Identifier, "OA")
# [1] "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA"
gsub('\\.', '', str_extract(Identifier, ".OA.?"))
# [1] "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA" "OA"
0 голосов
/ 12 ноября 2018

Вот альтернатива sub с использованием strsplit с apply:

sapply(Identifier, function(x) unlist(strsplit(x, "\\."))[3])

NC.1.OA   NC.1.OA.0   NC.1.OA.1 NC.1.OA.1.a NC.1.OA.1.b NC.1.OA.1.c 
    "OA"        "OA"        "OA"        "OA"        "OA"        "OA" 
NC.1.OA.2 NC.1.OA.2.0   NC.1.OA.3   NC.1.OA.4 
    "OA"        "OA"        "OA"        "OA" 
...