Извлечь все до третьего периода в строке - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть этот 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 Ответ

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

Мы можем использовать 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"
...