这个字符串是一个键的标记:OAT 3 25/32 7/17/17。我想提取的优惠券率是325/32,并被读为3 + 25/32或3.78125。现在,我一直试图用OAT删除日期和名称gsub,但是遇到了一些问题。
这是删除日期的代码:
tkr.bond <- 'OAT 3 25/32 7/17/17'
tkr.ptrn <- '[0-9][[:punct:]][0-9][[:punct:]][0-9]'
gsub(tkr.ptrn, "", tkr.bond)然而,它给了我同样的字符串。当我在模式中使用[0-9][[:punct:]][0-9]时,我设法删除了日期的一部分,但是它也删除了债券息票利率的分数部分。
棘手的事情是找到一个不涉及优惠券模式的解决方案,因为代码代码有以下形式:名称优惠券日期,因此,对优惠券使用特定模式可能会限制解决方案的范围。例如,如果代码为OAT 0 7/17/17,则优惠券为零。
发布于 2015-04-09 06:06:36
试一试
eval(parse(text=sub('[A-Z]+ ([0-9]+ )([0-9/]+) .*', '\\1 + \\2', tkr.bond)))
#[1] 3.78125或者你可能需要
sub('^[A-Z]+ ([^A-Z]+) [^ ]+$', '\\1', tkr.bond)
#[1] "3 25/32"更新
tkr.bond1 <- c(tkr.bond, 'OAT 0 7/17/17')
v1 <- sub('^[A-Z]+ ([^A-Z]+) [^ ]+$', '\\1', tkr.bond1)
unname(sapply(sub(' ', '+', v1), function(x) eval(parse(text=x))))
#[1] 3.78125 0.00000或
vapply(strsplit(tkr.bond1, ' '), function(x)
eval(parse(text= paste(x[-c(1, length(x))], collapse="+"))), 0)
#[1] 3.78125 0.00000或者没有eval(parse
vapply(strsplit(gsub('^[^ ]+ | [^ ]+$', '', tkr.bond1), '[ /]'), function(x) {
x1 <- as.numeric(x)
sum(x1[1], x1[2]/x1[3], na.rm=TRUE)}, 0)
#[1] 3.78125 0.00000发布于 2015-04-09 06:26:10
只需用空字符串替换第一个单词和最后一个单词。
> tkr.bond <- 'OAT 3 25/32 7/17/17'
> gsub("^\\S+\\s*|\\s*\\S+$", "", tkr.bond)
[1] "3 25/32"或
使用gsubfn函数按顺序使用替换部分中的函数.
> gsubfn("^\\S+\\s+(\\d+)\\s+(\\d+)/(\\d+).*", ~ as.numeric(x) + as.numeric(y)/as.numeric(z), tkr.bond)
[1] "3.78125"更新:
> tkr.bond1 <- c(tkr.bond, 'OAT 0 7/17/17')
> m <- gsub("^\\S+\\s*|\\s*\\S+$", "", tkr.bond1)
> gsubfn(".+", ~ eval(parse(text=x)), gsub("\\s+", "+", m))
[1] "3.78125" "0" 发布于 2015-04-09 06:11:21
类似于akrun的答案,使用sub替换。它的工作原理:你把你的“想要的”模式放在括号里,把其余的放在括号之外(同时仍然把regex字符和你不想保留的字符匹配起来)。然后,当您说replacement = "\\1"时,您表示整个字符串只能由括号内的内容替换。
sub(pattern = ".*\\s(\\d\\s\\d+\\/\\d+)\\s.*", replacement = "\\1", x = tkr.bond, perl = TRUE)
# [1] "3 25/32"然后您可以将其更改为数字:
temp <- sub(pattern = ".*\\s(\\d\\s\\d+\\/\\d+)\\s.*", replacement = "\\1", x = tkr.bond, perl = TRUE)
eval(parse(text=sub(" ","+",x = temp)))
# [1] 3.78125https://stackoverflow.com/questions/29530864
复制相似问题