我有一个如下所示的数据框:
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))
感谢您的帮助!专利
答案 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
会丢弃先前在匹配时打印的匹配字符。因此,先前匹配的EUR
和CHF
将被丢弃。
答案 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