R удалить элементы на основе нескольких вариантов - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть данные в списке, например,

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, ...) но конечный список.

Я пытался использовать условия OR для gsub, но до сих пор не получилось. Например,

> MWE_1 <- gsub("[^([:alpha:]|G20|EU28)]", "",MWE)
> MWE_1
[1] "Argentina20"    "G200"           "UnitedKingdom2" "EU2828"   

Кажется, я не нашел способа правильно использовать условие или. В идеале это будет разделять пробелы в зависимости от того, находится ли он между символами (например, в Соединенном Королевстве) или нет (например, в -2, 0 1,4) но я в порядке с UnitedKingdom в результате

Ответы [ 4 ]

2 голосов
/ 05 ноября 2019

Вы можете использовать первую группу захвата и сопоставить ее с остальной частью строки.

При замене используйте первую группу захвата.

^([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+ раз
  • $ Конец строки

Regex demo | R demo

Например

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 голос
/ 05 ноября 2019

Мой вариант:

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() дважды.

1 голос
/ 05 ноября 2019

Этот шаблон удаляет пробелы, за которыми следуют положительные или отрицательные числа, которые могут иметь десятичное число:

gsub("\\s+\\-?\\d+\\.?\\d*", "", MWE)
[1] "Argentina"      "G20"            "United Kingdom" "EU28" 

Возвращает все в строке до пробела, за которым следует число (положительное или отрицательное):

gsub("(.*?)\\s+\\-*\\d+.*", "\\1", MWE)
[1] "Argentina"      "G20"            "United Kingdom" "EU28"
0 голосов
/ 13 ноября 2019

Вы можете попробовать с gsub("\\s\\-?\\d+.*","",MWE), например,

> gsub("\\s\\-?\\d+.*","",MWE)
[1] "Argentina"      "G20"            "United Kingdom" "EU28" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...