сопоставление столбцов со строкой идентификатора и назначение нового значения в новом столбце - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть эти данные:

USDfirms <- c("GOOG", "BABA" "0071.TW")
TWRfirms <- c("3231.TW")
JPYfirms <- c("7752.T")

Я пытаюсь использовать функцию grepl для создания нового столбца.Поэтому, если ticker в данных df соответствует фирме 3231.TW в одном из 3 приведенных выше строковых векторов, присвойте значение (TWRmatch) или если ticker соответствует фирме GOOG, присвойте значение USDmatchи т. д.

Значения ticker не всегда идеально подходят, т. е. ticker 3231 не является точным соответствием для 3231.TW, поэтому я хочу использовать grepl, чтобы игнорировать.TW при сопоставлении.

df <- structure(list(symbol = c("3231.TW", "3231.TW", "3231.TW", "3231.TW", 
"7752.T", "7752.T", "7752.T", "7752.T", "GOOG", "GOOG", "GOOG", 
"GOOG", "BABA", "BABA", "BABA", "BABA"), ticker = c("3231", "3231", 
"3231", "3231", "7752", "7752", "7752", "7752", "GOOG", "GOOG", 
"GOOG", "GOOG", "BABA", "BABA", "BABA", "BABA"), country = c("TW", 
"TW", "TW", "TW", "T", "T", "T", "T", NA, NA, NA, NA, NA, NA, 
NA, NA), year = c(2017L, 2016L, 2015L, 2014L, 2018L, 2017L, 2016L, 
2015L, 2017L, 2016L, 2015L, 2014L, 2018L, 2017L, 2016L, 2015L
)), .Names = c("symbol", "ticker", "country", "year"), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 8L, 123L, 124L, 125L, 126L, 127L, 128L, 
129L, 130L), class = "data.frame")

РЕДАКТИРОВАТЬ:

Эта функция не работает

ifelse(grepl(USDfirms, df$ticker), "yes", "no")

У меня также есть treid:

df$match <- ifelse(USDfirms %in% x$ticker, "yes", "no")

Что даёт мне да за всё.

1 Ответ

0 голосов
/ 27 сентября 2018

Не идеальное решение, но методом грубой силы можно использовать вложенное решение lapply / sapply.Здесь есть двойной цикл на каждом ticker, проходящем по каждому элементу firm_list, и мы проверяем, присутствует ли он в каком-либо элементе в списке, и, если это так, извлекаем имя этого списка.

df$firms <- unlist(lapply(df$ticker, function(x)
        unlist(sapply(seq_along(firm_list), function(y) {
           if (any(grepl(x, unlist(firm_list[y])))) 
               names(firm_list[y])
})))) 

df

#     symbol ticker country year    firms
#1   3231.TW   3231      TW 2017 TWRfirms
#2   3231.TW   3231      TW 2016 TWRfirms
#3   3231.TW   3231      TW 2015 TWRfirms
#4   3231.TW   3231      TW 2014 TWRfirms
#5    7752.T   7752       T 2018 JPYfirms
#6    7752.T   7752       T 2017 JPYfirms
#7    7752.T   7752       T 2016 JPYfirms
#8    7752.T   7752       T 2015 JPYfirms
#123    GOOG   GOOG    <NA> 2017 USDfirms
#124    GOOG   GOOG    <NA> 2016 USDfirms
#125    GOOG   GOOG    <NA> 2015 USDfirms
#126    GOOG   GOOG    <NA> 2014 USDfirms
#127    BABA   BABA    <NA> 2018 USDfirms
#128    BABA   BABA    <NA> 2017 USDfirms
#129    BABA   BABA    <NA> 2016 USDfirms
#130    BABA   BABA    <NA> 2015 USDfirms

Мы перемещаем все фирмы в списке, чтобы их было легко проверить.

firm_list <- list(USDfirms = c("GOOG", "BABA", "0071.TW"), 
                  TWRfirms = c("3231.TW"), 
                  JPYfirms = c("7752.T"))

Или на самом деле было бы гораздо удобнее и короче, если мы создадим фрейм данных поиска, а затем сопоставим и извлечем его.

ref_df <- data.frame(firms = unlist(firm_list), 
           names = rep(names(firm_list), lengths(firm_list)))

df$firms <- ref_df$names[sapply(df$ticker, function(x) grep(x, ref_df$firms))]


df
#     symbol ticker country year    firms
#1   3231.TW   3231      TW 2017 TWRfirms
#2   3231.TW   3231      TW 2016 TWRfirms
#3   3231.TW   3231      TW 2015 TWRfirms
#4   3231.TW   3231      TW 2014 TWRfirms
#5    7752.T   7752       T 2018 JPYfirms
#6    7752.T   7752       T 2017 JPYfirms
#7    7752.T   7752       T 2016 JPYfirms
#8    7752.T   7752       T 2015 JPYfirms
#123    GOOG   GOOG    <NA> 2017 USDfirms
#124    GOOG   GOOG    <NA> 2016 USDfirms
#125    GOOG   GOOG    <NA> 2015 USDfirms
#126    GOOG   GOOG    <NA> 2014 USDfirms
#127    BABA   BABA    <NA> 2018 USDfirms
#128    BABA   BABA    <NA> 2017 USDfirms
#129    BABA   BABA    <NA> 2016 USDfirms
#130    BABA   BABA    <NA> 2015 USDfirms
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...