如何通过匹配字符串来过滤data.frame?

时间:2020-07-07 21:44:44

标签: r regex string dplyr stringr

我有那些结构:

coop <- structure(list(razao_social = c("COOPERATIVA AGROINDUSTRIAL ALFA", 
"COOPERATIVA MISTA DOS PRODUTORES DE LEITE DE MORRINHOS", "COOPERATIVA DE TRABALHO DOS PRESTADORES DE SERVICOS EM CONDOMINIOS - CONDOMINIUN", 
"COOPERATIVA EMPRESARIAL RURAL DE SAPUCARANA - COERSA", "COOPERATIVA AGROINDUSTRIAL ALFA", 
"COASUL COOPERATIVA AGROINDUSTRIAL", "COOPERATIVA DOS PLANTADORES DE CANA DA ZONA LENCOIS PTA", 
"COOPERATIVA AGROPECUARIA CENTRO SERRANA", "COOPERATIVA AGROINDUSTRIAL COOPERJA", 
"COOPERATIVA DOS CAFEICULTORES DA REGIAO DE GARCA", "COOPERATIVA DA CONSTRUCAO CIVIL DO ESTADO DE SERGIPE", 
"COOPERATIVA REG AGRO IND DE S DOMINGOS DO PRATA LTDA", "COOPERATIVA REG AGRO IND DE S DOMINGOS DO PRATA LTDA", 
"COOPERATIVA AGROPECUARIA VIDEIRENSE", "COOPERATIVA REGIONAL AGROPECUARIA VALE DO ITAJAI","COOPERATIVA DE TRABALHO E PRODUCAO ESPERACA"
), cnae_fiscal = c(4623109L, 4789099L, 9430800L, 9430800L, 4623108L, 
4623199L, 4789099L, 4789099L, 4789099L, 4789099L, 4789099L, 4633801L, 
4633801L, 4632001L, 4632001L,9430800L)), row.names = c(NA, 16L), class = "data.frame")


keywords <- c("abacaxi", "abate", "abatidas", "acabamento", "acácia", "açaí", 
"açúcar", "adoçantes", "adubos", "agentes", "aglomerada", 
"agr", "água", "aguardente", "aguardentes", "águas", "álcalis", 
"álcool", "alcoólicas", "algodão", "alho", "alimentação", 
"alimentares", "alimentícias", "alimentícios", "alimentos", 
"alopáticos", "ambiental", "amendoim", "amidos", "amiláceos", 
"animais", "animal", "aparelhos", "apicultura", "aquáticos", 
"aquicultura", "aqüicultura", "ar", "arroz", "artificiais", 
"árvores", "asininos", "atacadista", "atacado", "aves", "baía", 
"balas", "bambu", "banana", "banho", "base", "batata", "bebidas", 
"beneficiamento", "beterraba", "bicho", "biocombustíveis", "biscoitos", 
"bolachas", "bolos", "bolsas", "bombons", "bordar", "borracha", 
"bovinas", "bovinos", "bufalinos", "caça", "cacau", "café", 
"cafeeiro", "cafeicultor", "caju", "calçados", "cama", "camarões", 
"caminhões", "cana", "caprinos", "carburante", "carne", "carnes", 
"carpintaria", "carrocerias", "cartão", "cartolina", "carvão", 
"casas", "casca", "castanha", "cebola", "celulose", "celulósicas", 
"cereais", "cerveja", "cervejas", "chá", "charutos", "chás", 
"chocolates", "chope", "chopes", "cigarrilhas", "cigarros", "cítricos", 
"cloro", "coco", "coelhos", "colchões", "colheita", "combustíveis", 
"comerciais", "comestíveis", "concentrados", "condimento", "confeccionadas", 
"confeitaria", "confeitos", "conservação", "conservas", "contrato", 
"controle", "cordoaria", "corte", "cortiça", "costurar", "couro", 
"couros", "cristalizadas", "crustáceos", "cultivo", "cultivos", 
"curtimento", "defensivos", "dendê", "desdobramento", "desinfestantes", 
"destiladas", "dextrose", "dietéticos", "doce", "domissanitários", 
"equinos", "erva", "escargô", "especiarias", "espécies", "especificadas", 
"estamparia", "estimação", "estruturas", "eucalipto", "extração", 
"farinha", "farinhas", "farmacêuticas", "farmacêuticos", "farmoquímicos", 
"féculas", "feijão", "fermentos", "ferramenta", "fertilizantes", 
"fibras", "fios", "fitoterápicos", "flores", "florestais", "florestal", 
"florestas", "floricultura", "folha", "formação", "formulários", 
"forrageiras", "frangos", "frescos", "frigorífico", "frutas", 
"frutos", "fumo", "galináceos", "gases", "gelados", "gelo", 
"girassol", "gorduras", "gramas", "grão", "guaraná", "herbáceo", 
"higiênico", "higiênicos", "homeopáticos", "hortaliças", 
"horticultura", "hortifrutigranjeiros", "humano", "índia", "inglesa", 
"inseminação", "íntimas", "irrigação", "isotônicas", "jacaré", 
"lã", "laminada", "laminados", "laranja", "lãs", "látex", 
"laticínios", "lavoura", "lavouras", "legumes", "leguminosas", 
"leite", "leveduras", "linhas", "maçã", "madeira", "madeireiras", 
"madeireiros", "malas", "malha", "malharia", "malharias", "malte", 
"mamão", "mamona", "mandioca", "manejo", "manga", "mar", "maracujá", 
"margarina", "marinhos", "massas", "matadouro", "mate", "matérias", 
"medicamentos", "meias", "melancia", "melão", "mercadorias", 
"mexilhões", "milho", "mineral", "moagem", "moído", "molhos", 
"moluscos", "morango", "muares", "mudas", "nativas", "naturais", 
"oleaginosas", "óleo", "ondulado", "orgânicos", "organo", "origem", 
"ornamentais", "ostras", "ovinos", "ovos", "padaria", "pães", 
"palha", "palmito", "panificação", "papéis", "papel", "papelão", 
"pará", "pasto", "pecuária", "peixes", "peles", "pequenos", 
"permanente", "pesca", "pescado", "pescados", "pêssego", "pimenta", 
"pintos", "pinus", "plantadas", "plantas", "poda", "porte", "pratos", 
"produtos", "pulverização", "químicos", "raízes", "ranicultura", 
"rasteiro", "recreativos", "refinados", "refrescos", "refrigerante", 
"refrigerantes", "reino", "reses", "resseragem", "roupas", "rural", 
"salgada", "salobra", "seda", "sementes", "semicultivos", "seringueira", 
"serrarias", "serviço", "sisal", "soja", "solo", "solúvel", 
"sorvetes", "sucos", "suínas", "suínos", "tanoaria", "tapeçaria", 
"teca", "tecelagem", "tecidos", "temperos", "tênis", "termofixas", 
"termoplásticas", "têxteis", "têxtil", "texturização", "tomate", 
"torção", "torrado", "torrefação", "tosquiamento", "trançado", 
"trançados", "tratamento", "tricotagem", "tricotagens", "trigo", 
"tubérculos", "tubulares", "uísque", "uva", "vegetais", "vegetal", 
"veículos", "verduras", "vestuário", "veterinário", "vime", 
"vinagres", "vinho", "vivas", "viveiros", "vivos")

我想要一个名为coop_filter的data.frame,其中将有coop的列和其中$razao_social的单词是keywords的行。

注意:

  1. coop确实很大,因此我想在转移后删除该行。我认为这也可以避免重复。
  2. keywords中,我有“ agr”一词。我想用这个词过滤所有以“ agr”开头的词,例如AGROPECUARIA,AGRICOLA等。

我一直在尝试这样的事情:

library(tidyverse)

coop$razao_social <- tolower(coop$razao_social)

lixo <- c("-",",",".","(",")","  ",";",":")
for(i in 1:length(lixo)){
  coop$razao_social <- str_replace_all(coop$razao_social, fixed(lixo[i]), " ") 
  ifelse(i!=length(lixo),print(i),print(i) & rm(lixo,i))
}


# Filter

coop_filter <- data.frame()

for(i in length(keywords)){
  
  eval(parse(text=paste0("
  
                 coop_filter <- str_extract_all(coop$razao_social, '^.+",keywords[i],".+')
  
  ")))
  
}

我已经被卡在coop_filter中了。

1 个答案:

答案 0 :(得分:1)

使用此answer中的解决方案。

coop %>%
  filter(str_detect(razao_social, paste(toupper(keywords), collapse = "|")))

#-----
                                              razao_social cnae_fiscal
1                          COOPERATIVA AGROINDUSTRIAL ALFA     4623109
2                          COOPERATIVA AGROINDUSTRIAL ALFA     4623108
3                        COASUL COOPERATIVA AGROINDUSTRIAL     4623199
4  COOPERATIVA DOS PLANTADORES DE CANA DA ZONA LENCOIS PTA     4789099
5                  COOPERATIVA AGROPECUARIA CENTRO SERRANA     4789099
6                      COOPERATIVA AGROINDUSTRIAL COOPERJA     4789099
7         COOPERATIVA DOS CAFEICULTORES DA REGIAO DE GARCA     4789099
8     COOPERATIVA REG AGRO IND DE S DOMINGOS DO PRATA LTDA     4633801
9     COOPERATIVA REG AGRO IND DE S DOMINGOS DO PRATA LTDA     4633801
10                     COOPERATIVA AGROPECUARIA VIDEIRENSE     4632001
11        COOPERATIVA REGIONAL AGROPECUARIA VALE DO ITAJAI     4632001