从字符串中提取值

时间:2015-09-14 17:10:00

标签: r string grep character

我有一个如下所示的数据框:

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"出现了,但我完全不愿意产生任何可见的结果。

结果数据框应如下所示:

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))

感谢您的帮助!专利

2 个答案:

答案 0 :(得分: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会丢弃先前在匹配时打印的匹配字符。因此,先前匹配的EURCHF将被丢弃。

答案 1 :(得分: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)

你将这条线拆分为&#34; &#34;,然后将其转换为数字矩阵。所有无法强制为数字的元素都是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