Извлечение символов из строки на основе правила (повторный дефис) - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть большой фрейм данных со столбцом, который выглядит примерно так:

var <- c("150507-001-0000001", "KMD070515-2-0000001", 
"15144KMD01AA-0000001", "Z75Z151222-0000001")

Я хочу извлечь часть строки.Я хочу, чтобы все символы до второй дефис .Вот что мне нужно:

150507-001
KMD070515-2 
15144KMD01AA-0000001
Z75Z151222-0000001

Итак, я знаю, что если бы я хотел получить данные только перед дефисом, я бы сделал это:

> var <- sub("-.*", "", var)

> var

150507
KMD070515 
15144KMD01AA
Z75Z151222

Я также попробовал пакет qdap который дал мне то, что я хотел:

library("qdap")
var <- beg2char(var, "-", 2)

Я получил нужный мне столбец с последним кодом, однако что-то, похоже, не так.Потому что, когда я делаю left_join на основе столбца, это не работает.Я могу найти совпадение путем копирования-вставки в представлении данных, но left_join ничего не находит.Выполнение левого соединения с var, сделанным с помощью sub (см. Выше), однако, работает.Но для некоторых строк мне нужны символы после первого дефиса (и до второго), чтобы найти совпадение.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вот решение без регулярных выражений, для тех, кто может быть заинтересован:

x <- "150507-001-0000001"
paste(strsplit(x, "-")[[1]][1:2], collapse="-")

[1] "150507-001"

Если вы хотите применить эту логику ко всему вектору, используйте:

sapply(var, function(x) paste(strsplit(x, "-")[[1]][1:2], collapse="-"))
0 голосов
/ 21 декабря 2018

Мы можем использовать sub для сопоставления с шаблоном символов, которые не являются -, сопровождаемыми - и другим набором символов, которые не являются -, захватывать как группу ((...)) изаменить на обратную ссылку (\\1) захваченной группы

sub("^([^-]+-[^-]+).*", "\\1", var)
#[1] "150507-001"           "KMD070515-2"         
#[3]  "15144KMD01AA-0000001" "Z75Z151222-0000001"  
...