首页 > 解决方案 > 如何在 R 中对数据框的一列进行 grep 并返回多个子集?

问题描述

我正在处理一个非常混乱的数据集,我想使用关键字对列进行 grep,创建一个子集,然后循环到下一个关键字。例如,我想对单词“banana|apple”进行 grep,然后创建一个名为“fruits”的子集,然后搜索单词“brocolli|carrot”并创建一个名为“vegitables”的子集。

物品 价格 数量
香蕉 0.50 美元 10
香蕉 0.50 美元 5
香蕉 0.50 美元 5
成熟的香蕉 0.50 美元 3
苹果 1.00 美元 5
青苹果 1.10 美元 5
西兰花 1.15 美元 7
萝卜 1.50 美元 10
萝卜 1.50 美元 10

我能够使用这些代码行创建子集

fruits <- filter(df, grepl("banana|apple",ProcedureDisplay, ignore.case = TRUE, perl = FALSE))

vegitables <- filter(df, grepl("broccoli|carrot",ProcedureDisplay, ignore.case = TRUE, perl = FALSE))

但我想知道是否有一种方法可以设置参考表并使用以下内容进行循环:

for(i in 1:nrow(ref_table)){

  filter(df, grepl(i,ProcedureDisplay, ignore.case = TRUE, perl = FALSE))

}

ref_table

子集 搜索键
水果 “香蕉”、“苹果”
蔬菜 “西兰花”、“胡萝卜”

所以fruits输出应该是这样的

物品 价格 数量
香蕉 0.50 美元 10
香蕉 0.50 美元 5
香蕉 0.50 美元 5
成熟的香蕉 0.50 美元 3
苹果 1.00 美元 5
青苹果 1.10 美元 5

vegitables看起来像这样

物品 价格 数量
西兰花 1.15 美元 7
萝卜 1.50 美元 10
萝卜 1.50 美元 10

我想要一个参考表的原因是因为在我使用它的实际应用程序中,有多个搜索键并且它们会不断更新。与其搜索多行代码并尝试读取/解释/更新命令,其他用户最好简单地更新 r 脚本可以引用的表并使用 grep 函数。

标签: rloopsfilterdplyr

解决方案


一个整洁的选择。

library(dplyr)
library(stringr)

filter(df, str_detect(item, regex('banana|apple', T)))

# # A tibble: 6 x 3
#   item         price quantity
#   <chr>        <chr>    <dbl>
# 1 banana       $0.50       10
# 2 Banana       $0.50        5
# 3 bananas      $0.50        5
# 4 ripe bananas $0.50        3
# 5 apple        $1.00        5
# 6 green apple  $1.10        5

filter(df, str_detect(item, regex('broccoli|carrot', T)))

# # A tibble: 3 x 3
#   item     price quantity
#   <chr>    <chr>    <dbl>
# 1 broccoli $1.15        7
# 2 carrot   $1.50       10
# 3 Carrots  $1.50       10

推荐阅读