2014-10-23 4 views
0

Я надеюсь извлечь часть строки в R. У меня есть следующий вектор ХАРАКТЕР:Extract часть строки до или после заданного числа периодов

vars <- c("PANAS.pos.1","PANAS.neg.1", 
"PANAS.pos.2","PANAS.neg.2", 
"PANAS.pos.3","PANAS.neg.3", 
"PANAS.pos.4","PANAS.neg.4", 
"IPANAT.pos.1","IPANAT.neg.1", 
"IPANAT.pos.2","IPANAT.neg.2", 
"IPANAT.pos.3","IPANAT.neg.3", 
"IPANAT.pos.4","IPANAT.neg.4") 

И я желая разорвать его в два вектора символов, один с только текстом и один с только числом, как это:

v1 <- c(PANAS.pos, PANAS.neg, PANAS.pos, PANAS.neg, etc...) 
v2 <- c(1, 1, 2, 2, 3, 3, etc...) 

Я попытался с помощью суб(), но у меня возникают проблемы с периодом, я думаю. Я также рассматривал substr(), но текстовые части имеют одинаковую длину.

+0

Как насчет 'v1 <- подстрока (ПОСРЕДНИКОВ, 1, NCHAR (вары) -2); v2 <- as.numeric (substring (vars, nchar (vars))) ' –

+0

или использовать регулярное выражение' v1 <- unlist (strsplit (vars, split = '\\. \\ d')) ' – rawr

+0

Будут ли цифры в конце когда-нибудь будет больше 9? –

ответ

6
v1 <- sub("\\.[0-9]+$", "", vars) 
v2 <- as.numeric(sub(".*\\.", "",vars)) 

В первом случае v1, мы соответствуем силе dot(.) последующего номера [0-9]+ в конце ($) строки и заменить его "" во второй части sub аргумента. Для v2, ".* он соответствует одному или нескольким элементам до последней точки (\\.) и заменяет его "".

Или как предложено @Richard Scriven для v1. Здесь он немного более общий (я думаю). Он соответствует (.*) одному или нескольким элементам и фиксирует это как группу (), за которой следует точка [.] (последняя точка), за которой следует один или несколько элементов (вплоть до конца строки, хотя он не указан $). Для второй части аргумента мы используем \\1, чтобы получить захваченную группу. В этом случае существует только одна группа.

sub("(.*)[.].*", "\\1", vars) 

Или вы могли бы использовать strplit с regexlookahead. Здесь мы просим разделить по точкам (\\.), за которым следует цифра (?=\\d). Результатом будет список.

strsplit(vars, "\\.(?=\\d)", perl=TRUE) #Inspired from @rawr's comment 
+1

Первым может быть 'sub (" (. *) [.]. * "," \\ 1 ", vars)' –

+0

@Richard Scriven Спасибо, что является более кратким – akrun

+0

Спасибо! Это сработало. Какие-нибудь советы по расшифровке части регулярного выражения здесь? Кажется, я не могу определить шаблон., *,/И т. Д. – arrrrRgh

5

qdap пакет имеет функции convienence beg2charchar2end &, что справиться с этим:

library(qdap) 
v1 <- beg2char(vars, ".", 2) 
v2 <- as.numeric(char2end(vars, ".", 2)) 

## > beg2char(vars, ".", 2) 
## [1] "PANAS.pos" "PANAS.neg" "PANAS.pos" "PANAS.neg" "PANAS.pos" 
## [6] "PANAS.neg" "PANAS.pos" "PANAS.neg" "IPANAT.pos" "IPANAT.neg" 
## [11] "IPANAT.pos" "IPANAT.neg" "IPANAT.pos" "IPANAT.neg" "IPANAT.pos" 
## [16] "IPANAT.neg" 

## > as.numeric(char2end(vars, ".", 2)) 
## [1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 
Смежные вопросы