使用具有多个条件的部分匹配对df进行子集

时间:2018-07-20 13:27:33

标签: r subset string-matching

这是数据集:

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中的任何键,则SUBSET数据

因此,仅保留其中的行:

品牌 观察值与“ coca-”或“ cocacola”或“ coca cola”部分匹配)

OR

公司 观察结果部分匹配“可口可乐”或“可口可乐”或“可口可乐”或“饮料分配”)

注意:需要不区分大小写

理想的输出:

                 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

有什么想法吗?在此先感谢:)

2 个答案:

答案 0 :(得分:5)

使用正则表达式及其react-scripts eject(或)运算符。参数|处理大小写。

ignore.case

答案 1 :(得分:1)

考虑到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"