如何向 agrepl 提供要检查的字符串列表?

问题描述 投票:0回答:1

我正在尝试使用 agrepl 来检测数据帧

Ingredients
中的
df
变量是否包含多个可能的字符串(食品成分)之一。我想解释轻微的拼写错误或错误。我在一个安装软件包很困难的环境中工作,所以我热衷于使用 agrepl。
df
是用于说明的实际数据的非常简化版本,我已将
df
的数据放在本问题的末尾。

这些是我要检查的字符串:

strings_to_check <- c("Molybdenum Salt",
                      "Mineral Salt \\(Molybdenum Sulfide)",
                      "Molybdenum Sulfide",
                      "Mineral Salt \\(444\\)",
                      "444")

我可以使用

grepl
:

检测到这些字符串的存在
ingredients_df <- df %>% 
  mutate(Molybdenum = grepl(paste(strings_to_check, collapse = "|"), Ingredients))

当我将

agrepl
与单个字符串一起使用时,它也按预期工作:

one_string_df <- ingredients_df %>% 
  mutate(One_String = agrepl("Molybdenum Sulfide", Ingredients, max.distance = 2, ignore.case = TRUE))

但是

agrepl
与完整的
strings_to_check
对于每种情况都会返回 FALSE 值:

fuzzy_df <- ingredients_df %>% 
  mutate(Fuzzy_Molybdenum = agrepl(paste(strings_to_check, collapse = "|"), Ingredients, max.distance = 2, ignore.case = TRUE))

考虑到提供单个字符串与

strings_to_check
之间的差异,我认为 agrepl 使用
strings_to_check
的方式一定存在问题。我应该如何将字符串列表传递给 agrepl 以便它按预期工作?

我的预期输出是:

产品名称 成分 问题 模糊_钼
芝士墨西哥辣椒爆米花 糖 |油煎面包块 (10%)(小麦粉 | 植物油 | 盐 | 酵母) |矿物盐(硫化钼)|盐|天然风味 小错别字 错误 正确
奶油椰子咖喱汤 预混料[盐|矿物盐 (451 | 452 | 444 | 450) |糖|植物胶 (407a) |增味剂 (631 | 627)} |天然风味 不适用 正确 正确 脆脆切达干酪咬 不适用 错误 异国情调的泰国罗勒面条 不适用 正确
黄金蜂蜜小麦面包 芝麻 (3%) |酵母|黄豌豆粉|硫化钼|维生素(硫胺素 | 叶酸) 小写 错误 正确
美味松露通心粉和奶酪 米粉|增稠剂 (1412) |盐|硫化钼(天然来源)|草药 |矿物盐 (451) 防腐剂 (223) 不适用 正确 正确
天堂榛子冰淇淋 酸度调节剂 (339) |抗氧化剂 (316) |米拉布德努·苏菲尼 |固色剂(亚硝酸钠) 重大错别字 错误 错误
多汁菠萝爆冰沙 麦芽糊精 |盐|糖|天然香料(包含小麦 | 大豆) |干菜【洋葱|胡萝卜]|矿物盐 (444) 不适用 正确 正确
枫木釉面山核桃格兰诺拉麦片 干蔬菜(9%)(豌豆|蔬菜粉|糖|矿物盐(444)|酵母提取物|植物油|香草和香料|天然色素(100) 不适用 正确 正确
地中海香草园鹰嘴豆泥 电解质11.5%(硫化钠|磷酸三钙) 不适用 错误 错误
烤大蒜帕尔马椒盐卷饼 葡萄糖 |米粉|小麦粉|矿物质(锌|铁)|维生素(B12) 不适用 错误 错误
烟熏烧烤幸福薯片 矿物质(磷酸钙|硫化镁|硫化钼|硫化钠|硫酸亚铁|硒酸钠) 小错别字 错误 正确
辣芒果探戈莎莎 麦芽糊精 |过滤水|风味 |柠檬酸 (330) |硫化钼|苯甲酸钠 (211) |硫化钠 不适用 正确 正确
甜肉桂漩涡煎饼 培根(15%)【猪肉|盐|葡萄糖|蔗糖 |矿物盐 (450 | 451 | 452) |水|抗氧化剂 (316) |亚硝酸钠(250)] 不适用 错误 错误
柠檬水输液 洋葱粉(酵母提取物|天然香料(大豆)|矿物质|盐|硫化钼)|芝士粉(牛奶)|矿物盐 (444) 重复两个元素。 正确 正确

df
的数据:

structure(list(Product_Name = c("Cheesy Jalapeno Popcorn", "Creamy Coconut Curry Soup", 
"Crunchy Cheddar Bites", "Exotic Thai Basil Noodles", "Golden Honey Wheat Bread", 
"Gourmet Truffle Macaroni & Cheese", "Heavenly Hazelnut Delight Ice Cream", 
"Juicy Pineapple Burst Sorbet", "Maple Glazed Pecan Granola", 
"Mediterranean Herb Garden Hummus", "Roasted Garlic Parmesan Pretzels", 
"Smoky BBQ Bliss Potato Chips", "Spicy Mango Tango Salsa", "Sweet Cinnamon Swirl Pancakes", 
"Zesty Lemonade Infusion"), Ingredients = c("Sugar | Croutons (10%) (Wheat Flour | Vegetable Oil | Salt | Yeast) | Mineral Salt (Molybdenu Sulfide) | Salt | Natural Flavour", 
"Premix [Salt | Mineral Salts (451 | 452 | 444 | 450) | Sugar | Vegetable Gum (407a) | Flavour Enhancers (631 | 627)} | Natural Flavour", 
"Vegetable Oils (Palm | Canola) | Iodised Salt | Yellow Pea Flour", 
"Natural Cheese Flavour [Maltodextrin | Salt | Natural Flavour | Dextrose | Molybdenum Sulfide (444) | Yeast Extract]", 
"Sesame Seeds (3%) | Yeast | Yellow Pea Flour | molybdenum sulfide | Vitamins (Thiamin | Folic Acid)", 
"Rice Flour | Thickener (1412) | Salt | Molybdenum Sulfide (Natural Source) | Herbs | Mineral Salt (451) Preservative (223)", 
"Acidity Regulator (339) | Antioxidant (316) | Mylabdenu Sulfini | Colour Fixative (Sodium Nitrite)", 
"Maltodextrin | Salt | Sugar | Natural Flavours (Contains Wheat | Soy) | Dried Vegetables [Onion | Carrot] | Mineral Salt (444)", 
"Dried Vegetables (9%) (Peas | Vegetable Powder | Sugar | Mineral Salt (444) | Yeast Extract | Vegetable Oil | Herbs & Spices | Natural Colour (100)", 
"Electrolytes 11.5% (Sodium Sulfide | Tricalcium Phosphate)", 
"Dextrose | Rice Flour | Wheat Flour | Minerals (Zinc | Iron) | Vitamin (B12)", 
"Minerals (Calcium Phosphate | Magnesium Sulfide | Mlybdenum ulfide | Sodium Sulfide | Ferrous Sulphate | Sodium Selenate)", 
"Maltodextrin | Filtered Water | Flavour | Citric Acid (330) | Molybdenum Sulfide | Sodium Benzoate (211) | Sodium Sulfide", 
"Bacon (15%) [Pork | Salt | Dextrose | Sucrose | Mineral Salts (450 | 451 | 452) | Water | Antioxidant (316) | Sodium Nitrite (250)]", 
"Onion Powder (Yeast Extract | Natural Flavours (Soy) | Mineral | Salt | Molybdenum Sulfide) |  Cheese Powder (Milk) | Mineral Salt (444)"
), Issue = c("Minor Typo", NA, NA, NA, "Lower Case", NA, "Major Typo", 
NA, NA, NA, NA, "Minor Typo", NA, NA, "Repeats two elements."
)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-15L))
r string grepl
1个回答
0
投票

也许这就是矢量化的情况?

df$Fuzzy_Molybdenum <- 
    any(Vectorize(agrepl)( strings_to_check, df$Ingredients ))
© www.soinside.com 2019 - 2024. All rights reserved.