我在列表中有数据,例如
MWE <- list("Argentina -2.0 1.4", "G20 6.9 0.7", "United Kingdom 1.3 2.3", "EU28 6.6 2.8")
所需的输出:
[1] "Argentina" "G20" "United Kingdom" "EU28"
那是我的大多数标识符只是文字,但有些标识符具有数字(G7,G20,EA15等),但有一个有限列表。
我尝试在gsub
上使用OR条件,但到目前为止失败了。例如,
> MWE_1 <- gsub("[^([:alpha:]|G20|EU28)]", "",MWE)
> MWE_1
[1] "Argentina20" "G200" "UnitedKingdom2" "EU2828"
似乎我还没有找到正确使用or条件的方法 理想情况下,它会根据字符之间(例如英国)之间(例如-2,0 1,4)之间的空格来分隔空格,但我对UnitedKingdom表示满意
答案 0 :(得分:2)
您可以使用第一个捕获组并匹配其余的行。
在替换中,使用第一个捕获组。
^([A-Za-z]+(?: [A-Za-z]+)*|G20|EU28)\b.*$
^
字符串的开头(
捕获第1组
[A-Za-z]+
匹配1+ A-Za-z (?: [A-Za-z]+)*
重复0+次匹配一个空格和1+次a-zA-Z |
或G20
字面上匹配|
或EU28
字面上匹配)\b
紧随其后的是单词边界.*
匹配除换行符0次以上以外的所有字符$
字符串结尾例如
MWE <- list("Argentina -2.0 1.4", "G20 6.9 0.7", "United Kingdom 1.3 2.3", "EU28 6.6 2.8")
MWE_1 <- gsub("^([A-Za-z]+(?: [A-Za-z]+)*|G20|EU28)\\b.*$", "\\1",MWE)
MWE_1
输出
[1] "Argentina" "G20" "United Kingdom" "EU28"
使用:[[:alpha:]]
代码行看起来像
MWE_1 <- gsub("^([[:alpha:]]+(?: [[:alpha:]]+)*|G20|EU28)\\b.*$", "\\1",MWE)
答案 1 :(得分:1)
此模式会删除空格,后跟空格或可能带有小数的正数或负数:
gsub("\\s+\\-?\\d+\\.?\\d*", "", MWE)
[1] "Argentina" "G20" "United Kingdom" "EU28"
这将返回字符串中的所有内容,直至空格,后跟一个数字(正数或负数):
gsub("(.*?)\\s+\\-*\\d+.*", "\\1", MWE)
[1] "Argentina" "G20" "United Kingdom" "EU28"
答案 2 :(得分:1)
我的变体:
MWE <- list("Argentina -2.0 1.4", "G20 6.9 0.7", "United Kingdom 1.3 2.3", "EU28 6.6 2.8")
gsub("\\s+", "", gsub("[0-9\\-]+\\.+[0-9]+", "", MWE))
# [1] "Argentina" "G20" "UnitedKingdom" "EU28"
在这里,内部gsub()
查找以下模式:
-
或数字.
并删除匹配的模式(即,将其替换为""
)。
外部gsub()
然后从该结果中去除所有空格。
优点:您正在呼叫gsub()
。
缺点:您打了两次gsub()
。
答案 3 :(得分:0)
您可以尝试使用gsub("\\s\\-?\\d+.*","",MWE)
,例如
> gsub("\\s\\-?\\d+.*","",MWE)
[1] "Argentina" "G20" "United Kingdom" "EU28"