2015-09-14 10 views
1

У меня есть кадр данных, который выглядит следующим образом:Извлечение значений из строки символов,

data.frame(puts = c("Put Daimler N JUN13 EUR 50 (24.06.2013)", 
    "Put Daimler N SEP12 EUR 40.5 (24.09.2012)", 
    "Put Wincor Nixdorf OCT14 CHF 43.80 (20.10.2")) 

Мне нужно извлечь так называемые цены простиранию из каждой строки. Это означает, что мне нужно отделить цифры, которые следуют за описанием валюты EUR и CHF.

К сожалению, единственная константа в каждой строке состоит в том, что цены следуют либо символам EUR, либо CHF. Поэтому моя идея состояла в том, чтобы извлечь первое числовое значение после появления «EUR» или «CHF», но я полностью не смог представить какой-либо презентабельный результат.

Результирующий кадр данных должен выглядеть следующим образом:

data.frame(puts = c("Put Daimler N JUN13 EUR 50 (24.06.2013)", 
    "Put Daimler N SEP12 EUR 40.5 (24.09.2012)", 
    "Put Wincor Nixdorf OCT14 EUR 43.80 (20.10.2"), 
    strike = c(50, 40.5, 43.80)) 

Спасибо за вашу помощь! Pat

ответ

4

Вы можете использовать функцию sub.

df <- data.frame(puts = c("Put Daimler N JUN13 EUR 50 (24.06.2013)", 
       "Put Daimler N SEP12 EUR 40.5 (24.09.2012)", 
       "Put Wincor Nixdorf OCT14 CHF 43.80 (20.10.2")) 
df$strike <- as.numeric(sub(".* (?:CHF|EUR) (\\d+(?:\\.\\d+)?).*", "\\1",df$puts)) 
df 
#            puts strike 
# 1  Put Daimler N JUN13 EUR 50 (24.06.2013)  50 
# 2 Put Daimler N SEP12 EUR 40.5 (24.09.2012) 40.5 
# 3 Put Wincor Nixdorf OCT14 CHF 43.80 (20.10.2 43.80 

или

df$strike <- as.numeric(str_extract(df$puts, perl(" (?:EUR|CHF)\\s*\\K\\d+(?:\\.\\d+)?"))) 

\\K отбрасывает ранее совпавшие символы из печати в финале. Таким образом, ранее сопоставленные EUR и CHF отбрасываются.

+2

Очень красивый Авиньаш! Большое спасибо. Мне нужно много узнать о манипуляциях с строкой. Можете ли вы порекомендовать учебник по этим типам задач? – Pat

+0

@Pat Я многому научился от этого самого. Но вы можете подумать о том, чтобы прочитать это http://www.regular-expressions.info/ –

0

Это еще одно решение. Менее чистый, чем @Avinash, но он работает.

df<- data.frame(puts = c("Put Daimler N JUN13 EUR 50 (24.06.2013)", 
        "Put Daimler N SEP12 EUR 40.5 (24.09.2012)", 
        "Put Wincor Nixdorf OCT14 CHF 43.80 (20.10.2"),stringsAsFactors=F) 

Вы разделите строку на "", а затем преобразуете ее в матрицу числовых. Все элементы, которые не могут быть привязаны к числовым, будут NA. Удалите их, и у вас есть размолвка strike

out.aux <- apply(df,2, function(x) strsplit(x, " ")) 
out.aux <- as.numeric(unlist(out.aux)) 
df$strike <- out.aux[!is.na(out.aux)] 
rm(out.aux) 

> df 
             puts strike 
1  Put Daimler N JUN13 EUR 50 (24.06.2013) 50.0 
2 Put Daimler N SEP12 EUR 40.5 (24.09.2012) 40.5 
3 Put Wincor Nixdorf OCT14 CHF 43.80 (20.10.2 43.8 
+0

Что делать, если название компании «Century 21» или «Studio 54»? Вы надеетесь, что никакие другие цифры не появятся в строке. –

+0

Да, это провалится. Точно так же, как если бы было более одной валюты (EUR, CHF), с другим решением –

+1

Пользователь четко определил формат. Другое решение не должно учитывать случай, который отсутствует в данных. С другой стороны, ваше решение пропускает конкретный запрос, чтобы соответствовать номерам после сокращения валюты. –