Извлечь все до третьего периода в строке
У меня есть это Identifier
колонка
structure(list(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", "NC.1.OA.4.0", "NC.1.OA.9", "NC.1.OA.6",
"NC.1.OA.6.a", "NC.1.OA.6.b", "NC.1.OA.6.c", "NC.1.OA.6.d", "NC.1.OA.6.e",
"NC.1.OA.6.f", "NC.1.OA.6.f.0", "NC.1.OA.7", "NC.1.OA.8")), row.names = c(NA,
-22L), class = c("tbl_df", "tbl", "data.frame"))
Я хотел бы извлечь NC.1.OA
из этой колонки. Как правило, это будет извлекать все от начала до третьего периода, но первая строка будет нарушать это, поскольку есть только два периода.
я пробовал gsub(".*\\.(.*)\\..*", "\\1", Identifier)
без сигар.
1 ответ
Мы можем использовать str_extract
library(tidyverse)
df %>%
mutate(new = str_extract(Identifier, "NC\\.1\\.OA"))
Кроме того, если мы используем sub
(gsub
не требуется, поскольку мы не заменяем глобально), исправьте с помощью идентификатора позиции, чтобы уведомить старт (^
) строки. В приведенной ниже схеме мы сопоставляем один или несколько символов, которые не являются .
([^.]+
) с последующим .
([.]
- точка является метасимволом, поэтому мы экранируем или помещаем его в квадратные скобки, чтобы оценить буквально), а затем еще одну цифру (\\d+
), затем .
и символы, которые не ставят точку (как ранее), захватывают как группу (заключают в скобки) и при замене используют обратную ссылку (\\1
) захваченной группы
sub("^([^.]+[.]\\d+[.][^.]+).*", "\\1", df$Identifier)
#[1] "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA"
#[12] "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA" "NC.1.OA"