Извлечь символы, связанные скобками - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть данные, импортированные из файла .csv.Первый столбец содержит символьные строки, содержащие текст в скобках.Данные выглядят так:

    symbol
    ___________________________________________
1 | Apollo Senior Floating Rate Fund Inc. (AFT)
2 | Apollo Tactical Income Fund Inc. (AIF)
3 | Altra Industrial Motion Corp. (AIMC)
4 | Allegion plc (ALLE) 
5 | Amphenol Corporation (APH)
6 | Ares Management Corporation (ARES)
7 | ARMOUR Residential REIT, Inc. (ARR)
8 | Banc of California, Inc. (BANC)
9 | BlackRock Resources (BCX)
10| Belden Inc (BDC)
...

Мне нужно преобразовать этот столбец данных в список, такой как:

    symbol2
    ___________________________________________
1 | AFT
2 | AIF
3 | AIMC
4 | ALLE
5 | APH
6 | ARES
7 | ARR
8 | BANC
9 | BCX
10| BDC
...

Моя конечная цель - получить строку из одного символа, где текстсвязанные скобки разделяются знаком ";"как это:

"AFT;AIF;AIMC;ALLE;APH;ARES;ARR;BANC;BCX;BDC;..."

Я могу сделать этот последний шаг с

paste(symbol2, collapes = ";")

, но я не могу понять, как выделить нужный текст.

I 'я пробовал все перечисленное здесь ( извлечь подстроку в R в соответствии с шаблоном ), заменив ":" на "(", и не смог заставить что-либо работать. Я попытался:

gsub("(?<=\\()[^()]*(?=\\))(*SKIP)(*F)|.", "", symbol, perl=T)

как здесь рекомендовано ( Извлечь текст в скобках в R ), но вывод будет

"c(4, 5, 2, 1, 3, 6, 7, 8, 17, 9,...)"

Любая помощь?

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Вот вариант с использованием базовых R sub и группы захвата

df$symbol2 <- sub(".+\\((\\w+)\\)$", "\\1", df$V1)
df
#                                            V1 symbol2
#1  Apollo Senior Floating Rate Fund Inc. (AFT)     AFT
#2       Apollo Tactical Income Fund Inc. (AIF)     AIF
#3         Altra Industrial Motion Corp. (AIMC)    AIMC
#4                          Allegion plc (ALLE)    ALLE
#5                   Amphenol Corporation (APH)     APH
#6           Ares Management Corporation (ARES)    ARES
#7          ARMOUR Residential REIT, Inc. (ARR)     ARR
#8              Banc of California, Inc. (BANC)    BANC
#9                    BlackRock Resources (BCX)     BCX
#10                            Belden Inc (BDC)     BDC 

Пример данных

df <- read.table(text =
"'Apollo Senior Floating Rate Fund Inc. (AFT)'
'Apollo Tactical Income Fund Inc. (AIF)'
'Altra Industrial Motion Corp. (AIMC)'
'Allegion plc (ALLE)'
'Amphenol Corporation (APH)'
'Ares Management Corporation (ARES)'
'ARMOUR Residential REIT, Inc. (ARR)'
'Banc of California, Inc. (BANC)'
'BlackRock Resources (BCX)'
'Belden Inc (BDC)'", header = F)
0 голосов
/ 13 декабря 2018

1) read.table Используйте read.table с указанными значениями sep и comment, чтобы получить фрейм данных с двумя столбцами, в котором первый столбец является именами, а второй столбец -символы.Наконец, возьмите этот второй столбец и сверните его в одну строку.Пакеты или регулярные выражения не используются.

DF2 <- read.table(text = unlist(DF), sep = "(", comment = ")")
paste(DF2[[2]], collapse = ";")
## [1] "AFT;AIF;AIMC;ALLE;APH;ARES;ARR;BANC;BCX;BDC"

2) dplyr Мы можем использовать separate из tidyr для разделения столбцов имен и символов, одновременно удаляя столбец имен.unlist это и свернуть в одну строку.Необходимо использовать tidyr 0.8.2 или более позднюю версию.

library(dplyr)
library(tidyr)

DF %>%
  separate(symbol, c(NA, "symbol2"), "[()]", extra = "drop") %>%
  unlist %>%
  paste(collapse = ";")
## [1] "AFT;AIF;AIMC;ALLE;APH;ARES;ARR;BANC;BCX;BDC"

3) gsub Мы можем сопоставить все, вплоть до (включая ".*\\(", а также все, начиная с), т.е."\\).*" и замените их пустой строкой.Затем сверните, как и раньше.

paste(gsub(".*\\(|\\).*", "", DF$symbol), collapse = ";")
## [1] "AFT;AIF;AIMC;ALLE;APH;ARES;ARR;BANC;BCX;BDC"

4) trimws Это еще одно базовое решение.Требуется R 3.6.0 или более поздняя версия (в настоящее время r-devel).Мы определяем пробел как что-либо, кроме скобок, и используем trimws для его удаления.Затем мы определяем пробелы в скобках и затем удаляем их.Это оставляет нас с символами, которые мы теперь можем свернуть.

paste(trimws(trimws(DF$symbol, white = "[^()]"), white = "[()]"), collapse = ";")
## [1] "AFT;AIF;AIMC;ALLE;APH;ARES;ARR;BANC;BCX;BDC"

Примечание

Вводимый в воспроизводимой форме:

Lines <- "
    symbol
1 | Apollo Senior Floating Rate Fund Inc. (AFT)
2 | Apollo Tactical Income Fund Inc. (AIF)
3 | Altra Industrial Motion Corp. (AIMC)
4 | Allegion plc (ALLE) 
5 | Amphenol Corporation (APH)
6 | Ares Management Corporation (ARES)
7 | ARMOUR Residential REIT, Inc. (ARR)
8 | Banc of California, Inc. (BANC)
9 | BlackRock Resources (BCX)
10| Belden Inc (BDC)"
DF <- read.table(text = Lines, sep = "|", strip.white = TRUE, as.is = TRUE)
0 голосов
/ 13 декабря 2018

Мы можем извлечь содержимое, используя str_extract из stringr

library(stringr)
symbol2 <- str_extract(df$symbol, "(?<=\\().+?(?=\\))")
symbol2
#[1] "AFT"  "AIF"  "AIMC" "ALLE" "APH"  "ARES"

Регулярное выражение взято из здесь .

Затем вы можете paste их вместе

paste(symbol2, collapse = ";")
#[1] "AFT;AIF;AIMC;ALLE;APH;ARES"
...