r - 如何在 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 函数。
解决方案
一个整洁的选择。
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
推荐阅读
- c++ - Directx 12:在两个进程之间共享图形内存
- javascript - 可观察的总部。什么是错
- socket.io - 退出帐户时如何关闭套接字连接
- node.js - Node.js 应用程序充当生产者和消费者
- arkit - 获取 ARSCNFaceGeometry 的地标点
- flutter - 从另一个页面调用 setState() - Flutter
- node.js - 无法连接到 mongo 数据库
- kubernetes - 如何在aws EKS中从一个pod访问集群IP到另一个pod
- android - Unity 将图片传送到 Android
- azure-devops - TF400813: Azure DevOps 未获得授权