Извлечь все до третьего периода в строке

У меня есть это 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"
Другие вопросы по тегам