Все эти альтернативы не используют никаких пакетов или регулярных выражений.
1) basename / dirname Предполагая, что тестовый ввод s
, показанный в примечании в конце, преобразует точки в косые черты изатем используйте dirname
и basename
.
basename(dirname(chartr(".", "/", s)))
## [1] "IJKL" "IJKL"
2) strsplit Использование strsplit
разбивает строки по точкам, создавая список векторов символов, по одному вектору на входную строку,и затем для каждого такого вектора возьмите последние 2 элемента, используя tail
, и первый из тех, которые используют индексацию.
sapply(strsplit(s, ".", fixed = TRUE), function(x) tail(x, 2)[1])
## [1] "IJKL" "IJKL"
3) read.table Это не ясно из вопросав общем случае, но если все компоненты s имеют одинаковое количество полей, разделенных точками, то мы можем использовать read.table
для создания data.frame с одной строкой на входную строку и одним столбцом на компонент, разделенный точками. Затем возьмите столбец непосредственно перед последним.
dd <- read.table(text = s, sep = ".", as.is = TRUE)
dd[[ncol(dd)-1]]
## [1] "IJKL" "IJKL"
4) substr Опять же, общий случай неясен, но если интересующая строка всегда находится в позициях символов 12-15, топростое решение:
substr(s, 12, 15)
## [1] "IJKL" "IJKL"
Примечание
s <- c("ABCD.EF.GH.IJKL.MN", "ABCD.EF.GH.IJKL.MN")