[英]Subset a df using partial match with multiple criteria
這是數據集:
company <- c("Coca-Cola Inc.", "DF, CocaCola",
"COCA-COLA", "PepsiCo Inc.", "Beverages Distribution")
brand <- c("Coca-Cola Zero","N/A", "Coca-Cola", "Pepsi", "soft drink")
vol <- c("2456","1653", "19", "2766", "167")
data <-data.frame(company, brand, vol)
data
結果是:
company brand vol
1 Coca-Cola Inc. Coca-Cola Zero 2456
2 DF, CocaCola N/A 1653
3 COCA-COLA CocaCola 19
4 PepsiCo Inc. Pepsi 2766
5 Beverages Distribution soft drink 167
假設這是按品牌划分的進口量。
任務是對數據框進行替換,以僅查看與可口可樂相關的觀察結果,而不能查看其他任何品牌。
我們需要將COMPANY和BRAND變量與一系列條件(鍵)進行部分匹配:
company_key <- c("coca-", "cocacola", "coca cola", "beverages distribution")
brand_key <- c("coca-", "cocacola", "coca cola")
我正在努力執行這個想法:
如果品牌部分匹配brand_key向量中的任何鍵或公司部分匹配company_key中的任何鍵,則子數據
因此,僅保留其中的行:
( 品牌觀察部分匹配“可口可樂”或“可口可樂”或“可口可樂”)
要么
( 公司觀察部分匹配“可口可樂”或“可口可樂”或“可口可樂”或“飲料分銷”)
注意:需區分大小寫
理想的輸出:
company brand vol
1 Coca-Cola Inc. Coca-Cola Zero 2456
2 DF, CocaCola N/A 1653
3 COCA-COLA CocaCola 19
4 Beverages Distribution soft drink 167
有任何想法嗎? 提前致謝 :)
使用正則表達式及其|
(或)運算符。 參數ignore.case
處理大小寫。
index <- grepl(paste0(company_key, collapse = "|"), data$company, ignore.case = TRUE) |
grepl(paste0(brand_key, collapse = "|"), data$company, ignore.case = TRUE)
data[index,]
# company brand vol
#1 Coca-Cola Inc. Coca-Cola Zero 2456
#2 DF, CocaCola N/A 1653
#3 COCA-COLA Coca-Cola 19
#5 Beverages Distribution soft drink 167
考慮到coca
后面可以加上破折號或可樂,然后加上可選的空格。 我將兩列粘貼在一起以進行coca
搜索,並對Beverage Distribution
進行不同的測試
data[grepl("coca-|(\\s*cola)", paste(data[,1], data[,2]), ignore.case = T) |
grepl("Beverages Distribution",data[,1]),]
# company brand vol
# 1 Coca-Cola Inc. Coca-Cola Zero 2456
# 2 DF, CocaCola N/A 1653
# 3 COCA-COLA Coca-Cola 19
# 5 Beverages Distribution soft drink 167
如果Beverage Distribution
只能完全匹配,則可能需要將第二部分更改為data[,1] == "Beverages Distribution"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.