Извлечение значений по шаблону - PullRequest
3 голосов
/ 24 марта 2011

Вопрос новичка ...

У меня есть такой список:

x <- c("aa=v12, bb=x21, cc=f35", "xx=r53, bb=g-25, yy=h48", "nn=u75, bb=26, gg=m98")

(но гораздо больше строк)

Мне нужно извлечь то, что находится между "bb =" и ",". То есть Я хочу:

x21  
g-25  
26  

Прочитав много подобных вопросов здесь, я полагаю, что это строка с str_extract, которую я должен использовать, но почему-то я не могу заставить его работать. Спасибо за помощь.

/ Chris

Ответы [ 4 ]

4 голосов
/ 24 марта 2011

strapply в пакете gsubfn может сделать это. Обратите внимание, что [^,]* соответствует строке без запятых.

strapply извлекает часть с обратной ссылкой (часть в скобках):

> library(gsubfn)
> strapply(x, "bb=([^,]*)", simplify = TRUE)
[1] "x21"  "g-25" "26"  

Если имеется несколько x векторов, укажите их в виде списка:

> strapply(list(x, x), "bb=([^,]*)")
[[1]]
[1] "x21"  "g-25" "26"  

[[2]]
[1] "x21"  "g-25" "26"
2 голосов
/ 24 марта 2011

Опция, использующая regexpr:

> temp = regexpr('bb=[^,]*', x)
> substr(x, temp + 3, temp + attr(temp, 'match.length') - 1)
[1] "x21"  "g-25" "26"  
1 голос
/ 25 марта 2011

Прочитайте это с запятыми в качестве разделителей и возьмите второй столбец:

> x.split <- read.table(textConnection(x), header=FALSE, sep=",", stringsAsFactors=FALSE)[[2]] 
[1] " bb=x21"  " bb=g-25" " bb=26"  

Затем удалите "bb ="

> gsub("bb=", "", x.split ) 
[1] " x21"  " g-25" " 26"  
1 голос
/ 24 марта 2011

Вот одно решение, использующее базовые функции регулярных выражений в R. Сначала мы используем strsplit для разделения на запятую. Затем мы используем grepl для фильтрации только тех элементов, которые начинаются с bb= и gsub для извлечения всех символов после bb=.

> x <- c("aa=v12, bb=x21, cc=f35", "xx=r53, bb=g-25, yy=h48", "nn=u75, bb=26, gg=m98")
> y <- unlist(strsplit(x , ","))
> unlist(lapply(y[grepl("bb=", y)], function(x) gsub("^.*bb=(.*)", "\\1", x)))
[1] "x21"  "g-25" "26" 

Похоже, str_replace - это функция, которую вы ищете, если хотите идти по этому пути:

> str_replace(y[grepl("bb=",y)], "^.*bb=(.*)", "\\1")
[1] "x21"  "g-25" "26"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...