我有关于国家的数据,例如
MWE <- list("Argentina -2.4 3.4", "Euro area 3.7 6.4")
我想获取仅包含数字的列表。在我的示例中,得到"-2.4 3.4" "3.7 6.4"
。请注意,我的“国家/地区”可以用几个词来表示,因此我无法像想要的那样轻松地玩空格游戏。
我设法只用正数,用
MWE_1 <- sub("^.*?(\\d)", "\\1",MWE)
但是对于负数,或者在数字之前也可以使用其他词,我的方法无效。
我尝试使用|
,但都失败了
MWE_2 <- sub("^.*?(\\d)|^.*?(-)", "\\1",MWE)
MWE_3 <- sub("^.*?(\\d|-)", "\\1",MWE)
在不减去“ 2.4 3.4”“ 3.7 6.4”的情况下也得到了相同的结果。
如果我的MWE是
MWE <- list("R text1 47 GDP -2.4 3.4", "Euro area but not UK CPI 3.7 6.4")
我想从“ GDP”或“ CPI”中获取所有文本,即GDP 2.4 3.4
和CPI 3.7 6.4
。碰巧
NMWE2 <- sub("^.*?(GDP|CPI)",NMWE)
可以工作,所以我想这只是如何指定减号的问题,尽管用\\-
进行转义也不起作用。
`
答案 0 :(得分:2)
这里有一些替代方法。全部仅使用基数R。
1)在第一个数字字段附近插入逗号在第一个数字前后插入逗号(替换空格),然后使用read.table
:
read.table(text = sub(" ([-0-9.]+) ", ",\\1,", unlist(MWE)), sep = ",", as.is = TRUE)
给予:
V1 V2 V3
1 Argentina -2.4 3.4
2 Euro area 3.7 6.4
2)重复的子:用逗号替换最后一个空格两次。
mwe <- sub("(.*) ", "\\1,", sub("(.*) ", "\\1,", unlist(MWE)))
read.table(text = mwe, sep = ",", as.is = TRUE)
3)捕获 strcapture
采用一种模式并将每个捕获组放在一列中:
strcapture("(.*) (.*) (.*)", unlist(MWE),
list(V1 = character(0), V2 = numeric(0), V3 = numeric(0)))
答案 1 :(得分:1)
您要使用PCRE正则表达式(请注意,将perl=TRUE
与(g)sub
一起使用):
^(?:.*\b(GDP|CPI)\b|.*?([+-]?\d))
请参见regex demo。
详细信息
^
-字符串的开头(?:.*\b(GDP|CPI)\b|.*?([+-]?\d))
-与两个选项之一匹配的非捕获组:
.*\b(GDP|CPI)\b
-除换行符以外的任何零个或多个字符,应尽可能多,直到字符串的最后一个完整单词GDP
或CPI
(捕获到组1,{ {1}})\1
-或|
-除换行符外,任何零个或多个字符应尽可能少,直到第一个可选的.*?([+-]?\d)
或-
,然后是1位数字(捕获到组2中) +
。\2
答案 2 :(得分:1)
另一种可能性:
gsub(".*? ([^ ]+ .[^ ]+)","\\1", MWE)
#> [1] "-2.4 3.4" "3.7 6.4"
我们匹配以下序列:
将其替换为由后者3组成的组。
edit:阅读完另一个问题R remove elements based on several options后,您似乎想提取所有信息,在这种情况下,您可能会喜欢我的unglue
包裹。
# install.packages("unglue")
library(unglue)
MWE <- list("Argentina -2.4 3.4", "Euro area 3.7 6.4")
unglue_data(MWE,"{Country} {numbers=[^ ]+ [^ ]+}")
#> Country numbers
#> 1 Argentina -2.4 3.4
#> 2 Euro area 3.7 6.4
unglue_data(MWE,"{Country} {number1=[^ ]+} {number2=[^ ]+}", convert = TRUE)
#> Country number1 number2
#> 1 Argentina -2.4 3.4
#> 2 Euro area 3.7 6.4
由reprex package(v0.3.0)于2019-11-06创建
此处有更多相关信息:https://github.com/moodymudskipper/unglue/blob/master/README.md
答案 3 :(得分:0)
如果您的格式始终以两个实数结尾,那么也许可以执行以下操作:
gsub(".*?\\s(\\-?\\d+.*)","\\1",MWE)
匹配和提取从实数(或第一个数字的符号)开始