如何用str_detect统计匹配的关键配料数量并返回具体配料?
解决食物配料关键成分统计与提取问题
我有一个包含食物及其对应配料的dataframe df,需要找出含有Flour、Water或Salt的食物。目前已通过str_detect实现了判断食物是否包含这些关键配料的功能,现在需要进一步完成:
- 统计每种食物匹配到的关键配料数量
- 在单独列中返回具体使用的关键配料
预期输出包含Food、Ingredients、Key_Ingredient、Key_Count、Key_Used列。
完整的df数据如下:
df <- data.frame( Food = c("Appleberry Muffins", "Blue Moon Pancakes", "Crystalized Starfruit", "Dragonfruit Delight", "Ethereal Eclairs", "Flaming Firefruit", "Glowing Grapes", "Honeydew Haze", "Iridescent Ice Cream", "Jellybean Jamboree", "Kiwi Kaleidoscope", "Lunar Lemons", "Mystic Marshmallows", "Nebula Noodles", "Omega Oranges", "Phantom Peaches", "Quasar Quince", "Radiant Raspberries", "Stellar Strawberries", "Twilight Tangerines", "Universal Ugli Fruit", "Vortex Veggies", "Whirlwind Walnuts", "Xenon Xacuti", "Yellow Yams of Yore", "Zephyr Zucchini"), Ingredients = c("Flour, Vanilla Extract, Olive Oil, Milk, Garlic, Carrots, Chicken", "Baking Powder, Garlic, Eggs, Ice, Sugar, Tofu, Rice", "Milk, Beef, Tofu, Rice, Salt, Garlic, Mushrooms", "Rice, Milk, Pork, Yeast, Carrots, Tofu, Mushrooms", "Pasta, Flour, Water, Mushrooms, Chicken, Vanilla Extract, Yeast", "Pepper, Yeast, Vanilla Extract, Sugar, Wheat, Olive Oil, Pork", "Garlic, Nutmeg, Beef, Salt, Tofu, Onions, Baking Powder", "Salt, Water, Rice, Yeast, Flour, Honey, Mushrooms", "Water, Salt, Onions, Pasta, Spinach, Pork, Carrots", "Salt, Eggs, Flour, Baking Powder, Water, Potatoes, Yeast", "Water, Honey, Salt, Potatoes, Vanilla Extract, Pork, Pasta", "Salt, Tofu, Olive Oil, Baking Powder, Pork, Vanilla Extract, Cinnamon", "Salt, Flour, Onions, Water, Chicken, Eggs, Milk", "Honey, Flour, Pork, Beef, Potatoes, Spinach, Chicken", "Mushrooms, Water, Salt, Olive Oil, Spinach, Tofu, Potatoes", "Wheat, Carrots, Baking Powder, Tofu, Eggs, Nutmeg, Potatoes", "Honey, Tomatoes, Vanilla Extract, Flour, Garlic, Butter, Salt", "Salt, Yeast, Garlic, Rice, Sugar, Spinach, Baking Powder", "Flour, Onions, Spinach, Pork, Yeast, Water, Potatoes", "Potatoes, Eggs, Kale, Beef, Spinach, Vanilla Extract, Milk", "Cinnamon, Yeast, Potatoes, Flour, Salt, Water, Garlic", "Milk, Salt, Flour, Olive Oil, Garlic, Water, Spinach", "Salt, Flour, Beef, Garlic, Milk, Potatoes, Olive Oil", "Water, Salt, Yeast, Rice, Garlic, Vanilla Extract, Eggs", "Vanilla Extract, Garlic, Chestnuts, Baking Powder, Tofu, Carrots, Sugar", "Pork, Honey, Baking Powder, Onions, Sugar, Yeast, Water") )
解决方案
利用stringr的str_extract_all提取所有匹配的关键配料,结合purrr工具处理列表型结果,即可生成所需列。完整代码如下:
library(tidyverse) # 定义关键配料匹配模式 strings_to_check <- c("Water", "Salt", "Flour") pattern <- paste(strings_to_check, collapse = "|") df_result <- df %>% # 提取所有匹配的关键配料,返回列表格式 mutate(Key_Used_List = str_extract_all(Ingredients, pattern)) %>% # 将列表转为逗号分隔的字符串,无匹配则为空 mutate(Key_Used = map_chr(Key_Used_List, ~paste(.x, collapse = ", "))) %>% # 统计匹配到的关键配料数量 mutate(Key_Count = map_int(Key_Used_List, length)) %>% # 判断是否包含关键配料(与原逻辑等价) mutate(Key_Ingredient = Key_Count > 0) %>% # 保留需要的列,移除中间临时列 select(Food, Ingredients, Key_Ingredient, Key_Count, Key_Used)
关键步骤说明
str_extract_all(Ingredients, pattern):从配料字符串中批量提取所有符合条件的关键配料,每行返回一个列表map_chr(...):将每行的配料列表转为便于阅读的逗号分隔字符串map_int(...):统计每行匹配到的关键配料数量Key_Ingredient = Key_Count > 0:通过数量判断是否包含关键配料,和原str_detect逻辑完全一致
部分结果示例
运行代码后,前5行输出结果如下:
| Food | Ingredients | Key_Ingredient | Key_Count | Key_Used |
|---|---|---|---|---|
| Appleberry Muffins | Flour, Vanilla Extract, Olive Oil, Milk, Garlic, Carrots, Chicken | TRUE | 1 | Flour |
| Blue Moon Pancakes | Baking Powder, Garlic, Eggs, Ice, Sugar, Tofu, Rice | FALSE | 0 | |
| Crystalized Starfruit | Milk, Beef, Tofu, Rice, Salt, Garlic, Mushrooms | TRUE | 1 | Salt |
| Dragonfruit Delight | Rice, Milk, Pork, Yeast, Carrots, Tofu, Mushrooms | FALSE | 0 | |
| Ethereal Eclairs | Pasta, Flour, Water, Mushrooms, Chicken, Vanilla Extract, Yeast | TRUE | 2 | Flour, Water |
内容的提问来源于stack exchange,提问作者Jay Bee
相关产品推荐
相关产品推荐

