Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从字符串中提取值_R_Regex - Fatal编程技术网

R 从字符串中提取值

R 从字符串中提取值,r,regex,R,Regex,我有一个数据框,看起来像这样: 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")) data.frame(puts = c("Put Daimler N JUN13 EUR 50 (24.06.2013)", "Put Dai

我有一个数据框,看起来像这样:

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"))
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))
我需要从每个字符串中提取所谓的执行价。 这意味着我需要将欧元和瑞士法郎货币描述后面的数字分开

不幸的是,每个字符串中唯一的常量是价格跟随欧元或瑞士法郎字符。所以我的想法是在“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 CHF 43.80 (20.10.2"))
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

您可以使用
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您可以使用
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这是另一种解决方案。虽然不如@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)

这是另一个解决方案。虽然不如@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)

如果公司名称为
“21世纪”
“54工作室”
,该怎么办?您希望字符串中不会出现其他数字。是的,它会失败。与存在多种货币(欧元;瑞士法郎)的情况相同,使用另一种解决方案时,用户明确说明了格式。另一种解决方案不必考虑数据中没有的案例。另一方面,你的解决方案忽略了匹配货币缩写后数字的具体要求。我同意皮埃尔的观点。但是谢谢你文森特的帮助!如果公司名称为
“21世纪”
“54工作室”
,该怎么办?您希望字符串中不会出现其他数字。是的,它会失败。与存在多种货币(欧元;瑞士法郎)的情况相同,使用另一种解决方案时,用户明确说明了格式。另一种解决方案不必考虑数据中没有的案例。另一方面,你的解决方案忽略了匹配货币缩写后数字的具体要求。我同意皮埃尔的观点。但是谢谢你文森特的帮助!非常好的阿维纳什!谢谢。我必须学习很多关于字符串操作的知识。你能推荐一个关于这类任务的教程吗?@Pat我从中学到了很多。但你可以考虑阅读这个非常好的阿维纳什!谢谢。我必须学习很多关于字符串操作的知识。你能推荐一个关于这类任务的教程吗?@Pat我从中学到了很多。但是你可以考虑阅读