Я хочу извлечь строки из списка, содержащего идентификаторы разной длины. По сути, я хочу сохранить все символы идентификаторов до 3-го вхождения «-», кроме алфавита в конце, и удалить остальные. Пример списка ниже:
mylist <- c("abc-nop-7a-2","abc-nop-7b-3p", "abc-nop-18a-5p/18c-5p", "abc-xyz-198_5p")
Я хочу, чтобы результирующий список выглядел так:
result <- c("abc-nop-7","abc-nop-7", "abc-nop-18", "abc-xyz-198")
Я попытался разбить строки, а затем выбрать нужный раздел, но я не был уверен, как вызывать разделы до определенного момента. Я попытался:
mylist <- gsub("-", "_", mylist) #"-" was not not acceptable as a character
mylist <- strsplit(mylist, "_")
sapply(mylist, `[`, 3)
Но, конечно, вышеизложенное дает мне что-то вроде этого:
"7","7", "18", "198"
Есть ли способ вызвать раздел извлечения 1 ~ 3, который я разделил в методе выше? или если есть более эффективные способы выполнить задачу через stringr или что-то в этом роде, я тоже был бы признателен за это.
Заранее спасибо.
Мы можем захватить как группу и заменить обратной ссылкой (\\1
)
sub("^(([^-]+-){2}[0-9]+).*", "\\1", mylist)
[1] "abc-nop-7" "abc-nop-7" "abc-nop-18" "abc-xyz-198"
совпадающий шаблон - это два ({2}
) экземпляра символов, которые не являются -
([^-]+
), за которыми следует -
из начала (^
) строки, за которым следует одна или несколько цифр ([0-9]+
), захваченных ((...)
) и в замена, укажите обратную ссылку захваченной группы