这里有一些替代方法。全部仅使用基数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("(.*) ",unlist(MWE)))
read.table(text = mwe,as.is = TRUE)
3)捕获 strcapture
采用一种模式并将每个捕获组放在一列中:
strcapture("(.*) (.*) (.*)",unlist(MWE),list(V1 = character(0),V2 = numeric(0),V3 = numeric(0)))
,
您要使用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中) +
。
R demo:
\2
,
另一种可能性:
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
,
如果您的格式始终以两个实数结尾,那么也许可以执行以下操作:
gsub(".*?\\s(\\-?\\d+.*)",MWE)
匹配和提取从实数(或第一个数字的符号)开始
本文链接:https://www.f2er.com/3158234.html