2015-12-03 3 views
-1

У меня есть текст, который выглядит следующим образом:R: GSUB слова между пространством

a <- "233,236,241 solitude ΔE=1.9" 

То, что я хочу сделать, это извлечь второе слово между двумя пространствами(), что дает этот выход

> solitude 

Я попробовал два метода:

a1 <- strsplit(a,' ',fixed=TRUE)[[1]][2] 
a2 <- sapply(strsplit(a, " ", fixed=TRUE), "[", 2) 

Но это всегда показывает:

ΔE=1.9 

Каков правильный путь?

+3

'strsplit (a, '') [[1]] [2]' работает для 'a <-" 233,236,241 одиночество ΔE = 1.9 "' – etienne

+3

Или, может быть, просто 'sub (". * \\ s + (. *)) \\ s +. * "," \\ 1 ", a)' –

+1

Я получаю «одиночество» с каждым из ваших методов ... – Cath

ответ

1

Попробуйте это:

gsub("\\s.+$","",gsub("^.+[[:digit:]]\\s","",a)) 
+1

Какой смысл в двух вызовах 'gsub'? –

+0

Первый разрезает текст до пространства перед «уединением». Второй вырезает текст из пространства после «уединения» до конца. –

0

Вот подход с использованием классов захвата (шаблоны внутри скобок) и классы персонажей (узоры внутри квадрата brackest).

sub("(^[^ ]*[ ])([^ ]*)([ ].*$)" , "\\2", a) 
[1] "solitude" 

Комментирование первый шаблон класса захвата:

"(^[^ ]*[ ])([^ ]*)([ ].*$)" , "\\2", a) 
     \finds first space 
     \ an arbitrary number of times 
    \\ inside a character class an '^' as the first character ... 
     signals negation of character class. This one with only the space character in it. 
    \----- '^' marks the beginning of a character value 

Второй шаблон класса захвата:

"(^[^ ]*[ ])([^ ]*)([ ].*$)" , "\\2", a) 
       \ an arbitrary number of times 
       \\negation of character class with only the space character in it. 

Третий класс захвата:

"(^[^ ]*[ ])([^ ]*)([ ].*$)" , "\\2", a) 
        \ the second space 
         \\anything after second space to end. 

В "\\<n>" данные, введенные в replacement ссылаются на класс захвата, соответствующий порядку, который они отображаются в аргументе pattern.

Смежные вопросы