Условное совпадение строк R векторный символ Свернуть Выбор элементов - PullRequest
0 голосов
/ 16 января 2019

У меня есть символьный вектор, в котором я хотел бы сопоставить определенную строку, а затем свернуть элемент, содержащий эту строку, соответствует только со следующим элементом в символьном векторе, а затем разрешить процесс продолжаться до символьный вектор заканчивается. Например, только одна ситуация:

'"FundSponsor:Blackrock Advisors" "Category:"  "Tax-Free Income-Pennsylvania"  "Ticker:"  "MPA" "NAV Ticker:" "XMPAX"                          "Average Daily Volume (shares):" "26,000"                         "Average Daily Volume (USD):"    "$0.335M"                        "Inception Date:"  "10/30/1992" "Inception Share Price:" "$15.00"                         "Inception NAV:" "$14.18" "Tender Offer:" "No"                             "Term:" "No"'   

Объединение каждого элемента, содержащего : только с последующим элементом, было бы здорово, НО я боролся с использованием функции вставки, потому что она обычно просто объединяет весь вектор на основе : в один элемент, который не более целенаправленное решение, которое я ищу.

Вот пример того, как бы я хотел, чтобы часть пересмотренного вывода выглядела так:

"Inception Share Price:$15.00"

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вот что может помочь:

Сначала разделить, используя strsplit, затем связать элементы, которые принадлежат друг другу

# split the string
vec <- unlist(strsplit(string, '(?=\")(?=\")', perl = TRUE))
vec <- vec[! vec %in% c(' ', '\"')]
# that's how vec looks like right now
head(vec)
# [1] "FundSponsor:Blackrock Advisors" "Category:"                      "Tax-Free Income-Pennsylvania"   "Ticker:"                        "MPA"                           
# [6] "NAV Ticker:"    
#
# now paste the elements
ind <- grepl(':.+',vec)
tmp <- vec[!ind]
vec[!ind] <- paste0(tmp[seq(1,length(tmp),2)], tmp[seq(2,length(tmp),2)])
head(vec)
# [1] "FundSponsor:Blackrock Advisors"        "Category:Tax-Free Income-Pennsylvania" "Ticker:MPA"                            "NAV Ticker:XMPAX"                     
# [5] "Average Daily Volume (shares):26,000"  "Average Daily Volume (USD):$0.335M" 

с данными

string = "\"FundSponsor:Blackrock Advisors\" \"Category:\" \"Tax-Free Income-Pennsylvania\" \"Ticker:\" \"MPA\" \"NAV Ticker:\" \"XMPAX\" \"Average Daily Volume (shares):\" \"26,000\" \"Average Daily Volume (USD):\" \"$0.335M\" \"Inception Date:\" \"10/30/1992\" \"Inception Share Price:\" \"$15.00\" \"Inception NAV:\" \"$14.18\" \"Tender Offer:\" \"No\" \"Term:\" \"No\""

Объяснение

  • regex (?=\")(?=\") в основном говорит R разбивать строку, когда есть два \". Синтаксис (?!*something*) означает, что *something* идет до / после. Таким образом, вышеприведенное просто гласит: разбить строку в каждой позиции, которой предшествует \" и которая предшествует \".
  • Приведенное выше strsplit(...) создает элементы вида \" и ('\"Category:\" \"...' становится вектором '\"';'Category:';'\"';' ';'...'). Таким образом, используя ! vec %in% c(...), мы удаляем эти нежелательные элементы.

Добавление

Если содержатся элементы формы "string:", за которыми следует " ", в приведенном выше коде удалите строку vec <- vec[! vec %in% c(' ', '\"')] и добавьте строки

vec <- vec[seq(2L, length(vec), 4L)]
vec[vec == ' '] <- NA_character_
0 голосов
/ 16 января 2019

Я не уверен, хотите ли вы, чтобы результат представлял собой один единственный ключ: формат значения или если вы просто хотите очистить эту длинную строку и получить ее в следующем формате ключ1: значение1 ключ2: значение2 ключ3: значение3.Если это так, вы можете достичь этого с помощью следующего кода:

char = '"FundSponsor:Blackrock Advisors" "Category:" "Tax-Free Income-Pennsylvania" "Ticker:" "MPA" "NAV Ticker:" "XMPAX" "Average Daily Volume (shares):" "26,000" "Average Daily Volume (USD):" "$0.335M" "Inception Date:" "10/30/1992" "Inception Share Price:" "$15.00" "Inception NAV:" "$14.18" "Tender Offer:" "No" "Term:" "No"'

char_tidy = gsub('\\" \\"', " ", char)

# output is below
> char_tidy
[1] "\"FundSponsor:Blackrock Advisors Category: Tax-Free Income-Pennsylvania Ticker: MPA NAV Ticker: XMPAX Average Daily Volume (shares): 26,000 Average Daily Volume (USD): $0.335M Inception Date: 10/30/1992 Inception Share Price: $15.00 Inception NAV: $14.18 Tender Offer: No Term: No\""
...