r - 在 SQL 查询列上运行 While 循环(需要使用 sqldf 完成)
问题描述
我不确定这是否可能。
现在我正在使用sqldf
包运行它:
Col1 <- c('emdabcer','deffghiee','lmnop')
Col2 <- c(1,2,3)
df <- data.frame(Col1, Col2)
df
Col1 Col2
emdabcer 1
deffghiee 2
lmnop 3
现在,我正在手动输入 SQL 脚本。
sqldf("SELECT *, CASE
WHEN [Col1] LIKE '%abc%' THEN REPLACE([Col1], [Col1], 'Label1')
WHEN [Col1] LIKE '%def%' AND [Col1] LIKE '%ghi%' THEN REPLACE([Col1], [Col1], 'Label2')
ELSE NULL END [Category Label] FROM df")
我的实际数据集中有 40 个不同的 CASE WHEN 实例。
有没有办法我可以使用一个单独的表/数据框,它有一列我的 SQL 查询并运行每一行来获取我的输出?
下面是我的查询的示例数据框:
Queries <- c("WHEN [Col1] LIKE '%abc%' THEN REPLACE([Col1], [Col1], 'Label1')",
"WHEN [Col1] LIKE '%def%' AND [Col1] LIKE '%ghi%' THEN REPLACE([Col1], [Col1], 'Label2')",
"WHEN [Col1] LIKE '%mn%' THEN REPLACE([Col1], [Col1], 'Label3')")
Query_df <- data.frame(Queries)
Query_df
Queries
WHEN [Col1] LIKE '%abc%' THEN REPLACE([Col1], [Col1], 'Label1')
WHEN [Col1] LIKE '%def%' AND [Col1] LIKE '%ghi%' THEN REPLACE([Col1], [Col1], 'Label2')
WHEN [Col1] LIKE '%mn%' THEN REPLACE([Col1], [Col1], 'Label3')
然后我会做这样的事情:
sqldf("SELECT *, CASE
WHILE length(Queries_df) <= length(Queries_df)
BEGIN RUN Queries
END
我知道上面的内容是错误的,但沿着这些思路。
任何帮助都会非常感谢!
这是我正在研究的参考:https ://www.essentialsql.com/using-while-statement-stored-procedures/
解决方案
创建Pat
定义要查找的模式的数据框,然后将其加入df
:
Pat <- data.frame(
pat1 = c('abc', 'def'),
pat2 = c('', 'ghi'),
Label = c('Label1', 'Label2'),
stringsAsFactors = FALSE)
sqldf("select a.*, b.Label
from df a
left join Pat b on a.Col1 like '%' || b.pat1 || '%' and
a.Col1 like '%' || b.pat2 || '%'")
给予:
Col1 Col2 Label
1 emdabcer 1 Label1
2 deffghiee 2 Label2
3 lmnop 3 <NA>
推荐阅读
- reactjs - 应用程序在 heroku 上运行良好,除了一个问题
- amazon-web-services - 获取 AWS 机器类型(ubuntu/nixos/centos 等)
- browser - 屏幕阅读器在按下按钮或链接时使用什么浏览器事件?
- java - JPanel paintComponent() 不会在 JFrame 中绘制
- apache-flink - 理解 Flink 中使用的 Status.JVM.Memory.Direct.Memory
- php - PHP 错误处理程序抛出未被捕获的异常
- python - 具有名称属性的熊猫数据框
- ember.js - Ember.js 模板中的 `take` 是什么意思
- python - Python 脚本抛出错误并退出,OSError: [Errno 113] Connect call failed on portscan with Asyncio
- flutter - 使用 .text getter/setter 时 TextEditingController 抛出 null