R中多个选项的模式匹配

pattern matching with multiple options in R

我有一个文件名列表,所有这些文件名都来自不同的提供商。提供者名称的给出不一致,例如“Apple”和“APPL”。如果数据具有匹配的字符串,我试图找到一种方法将正确的名称附加到文件数据框。例如,如果文件名包含“Apple”,那么在数据框中,正确的名称“APPL”将附加在它的旁边。对不起,如果我没有包括我的尝试,我只是认为这会混淆这个问题,因为我是一个完全的初学者。多谢!

(实际上我有大约 1000 个文件名和 30 个左右的提供商名称,每个名称都有大约 3 种可能的模式。哎呀!)


stock_tickers <- data.frame("APPL", "MSFT")

financial_reports <- data.frame("financial_report_names" = "AppleFinance.csv", "APPLStock.csv", "financesMICROSOFT.csv", "MSFTstocks.csv", "UberStocks.csv",
                                "report_month" = "202101", "202101", "202102", "202102", "202102")

APPL_matches <- c("APPL", "Apple")
MSFT_matches <- c("MSFT", "Microsoft")


#expected output
# financial_report_names      report month      matching ticker
# "AppleFinance.csv"          202101            APPL
# "APPLStock.csv"             202102            APPL
# "financesMICROSOFT.csv"     202102            MSFT
# "MSFTstocks.csv"            202102            MSFT
# "UberStocks.csv"            202102            N/A

您可以创建一个正则表达式模式,它可以采用所有可能的代码模式组合并使用 stringr::str_replace_all -

ptrn <- c(".*(APPL|Apple|APPLE).*" = 'APPL', 
          ".*(MSFT|Microsoft|MICROSOFT).*" = 'MSFT', 
          ".*(Uber).*" = 'UBER')

stringr::str_replace_all(financial_reports$financial_report_names, ptrn)

#[1] "APPL" "APPL" "MSFT" "MSFT" "UBER"

如果保存在 dataframe 或 csv 中,您也可以动态生成此模式。

数据

financial_reports <- structure(list(financial_report_names = c("AppleFinance.csv", 
"APPLStock.csv", "financesMICROSOFT.csv", "MSFTstocks.csv", "UberStocks.csv"
), report_month = c("202101", "202101", "202102", "202102", "202102"
)), class = "data.frame", row.names = c(NA, -5L))