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