【问题标题】:A function in R to mimic "LIKE" in MySQL (update)R中的一个函数来模仿MySQL中的“LIKE”(更新)
【发布时间】:2014-02-10 08:18:47
【问题描述】:

我需要一个 R 中的函数来模仿 LIKE in MySQL 的功能。

(我需要相互验证 SQL 查询和 R 脚本的结果。如果我有一个函数可以模仿 LIKE 的功能,那就太好了,这可以减少我的工作量。)

我从上面的链接中添加了 LIKE 的一些行为。如您所见,LIKE 与标准 grep 正则表达式有一些不同之处。

LIKE(来自链接的描述)

  • 使用 SQL 简单正则表达式比较的模式匹配。返回 1 (TRUE) 或 0 (FALSE)。
  • 根据 SQL 标准,LIKE 以每个字符为基础执行匹配,因此它可以产生与 = 比较运算符不同的结果:
  • 尾随空格很重要
  • 使用 LIKE,您可以在模式中使用以下两个通配符。 人物描述 % 匹配任意数量的字符,甚至是零个字符 _ 只匹配一个字符
  • 在 MySQL 中,数字表达式允许使用 LIKE。 (这是标准 SQL LIKE 的扩展。)

    mysql> SELECT 10 LIKE '1%'; -> 1

【问题讨论】:

  • 我会说 R,但不幸的是不会说 MySQL。由于您没有解释 LIKE 的确切作用,因此能够帮助您的人越来越少。
  • LIKE 不做近似字符串匹配,所以 agrep 不是很合适。我在上面更详细地描述了这个功能(编辑过的问题)。
  • 您正在寻找不存在的东西。如果你真的想去麦当劳,你不需要寻找汉堡王之类的替代品:你只需要去麦当劳。因此,如果您更喜欢这样,请使用 sql、sqldf 或编写自己的代码。
  • 我需要相互验证 SQL 查询和 R 脚本的结果。如果我有一个可以模仿 LIKE 功能的函数,那就太好了,这会减少我的工作量。

标签: mysql r sql-like


【解决方案1】:

试试sqldf 包。你可以在data.frame上写类似sql的查询

例如:

require(sqldf)
data(CO2)

new.data <- sqldf("select * from CO2 where Plant like 'Qn%'")

【讨论】:

  • 并在 SO 中搜索 SQLite 语法:stackoverflow.com/questions/7323162/sqlite-like-and
  • 我知道 sqldf。但是,出于正当的原因,我不能在这里详细介绍,我不想编写类似 SQL 的查询。如果我想这样做,我可以自己运行确切的 SQL 查询。
  • 那你想要什么?抱歉,有点不清楚
  • 我需要相互验证 SQL 查询和 R 脚本的结果。如果我有一个可以模仿 LIKE 功能的函数,那就太好了,这会减少我的工作量。
【解决方案2】:

尝试 ?grepl 或打包 sqldf

df=data.frame(A=c("mytext_is_here","anothertext_is_here","mytext_is_also_here"),B=1:3)
df

firstSolution = subset(df, grepl("^mytext", A))

library("sqldf")
secondSolution = sqldf("select * from df where A like 'mytext%'")

来源:http://cran.r-project.org/web/packages/sqldf/sqldf.pdf第8页

【讨论】:

  • sqldf 不是一个选项,我不想运行 sql 或类似 sql 的查询。 grepl 很接近,但不能完全模仿行为。它也不是矢量化的(“模式”总是原子的)。我想我得自己写这个函数。
【解决方案3】:

我认为你可以在 R 中使用 grepl 函数来做同样的事情。 grepl 会进行部分字符串匹配,它会返回一个逻辑向量,您以后也可以将其用于子集数据以及其他条件。

您也可以稍后使用“!”在 grepl 前面签名以过滤掉具有该表达式的结果。

ex. sample=c("data","ddata","ddata1")
filtered_data=grepl("dd",sample)
# it gives a logical vector FALSE TRUE TRUE

#and it can be used as follows to find out all the elements that have a string "dd" in it.
sample[grepl("dd",sample)]

请注意,grepl 区分大小写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多