首页 > 解决方案 > 与 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

标签: rloopsstringr

解决方案


您可以创建一个正则表达式模式,该模式可以采用所有可能的股票模式组合并使用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"

如果保存在数据框或 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))

推荐阅读