【问题标题】:Properties of pmatch functionpmatch 函数的性质
【发布时间】:2019-02-12 15:23:20
【问题描述】:

我不明白内置函数 pmatch 的行为(部分字符串匹配)。

描述提供了以下示例:

pmatch("m",   c("mean", "median", "mode")) # returns NA instead of 1,2,3

但使用:

pmatch("m", "mean") # returns 1, as I would have expected. 

谁能向我解释这种行为?

【问题讨论】:

  • nomatch:在不匹配或乘以部分匹配位置返回的值。请注意,它被强制转换为整数。
  • 您是否只想解释为什么 pmatch 因多个部分匹配而损坏(返回 NA),还是需要实际的解决方案?我发布了后者。

标签: r string-matching na partial no-match


【解决方案1】:

改用grep - pmatch 的 NA-on-duplicates 行为非常烦人

grep("^m",   c("mean", "median", "mode"))
[1] 1 2 3

> grep("ed",   c("mean", "median", "mode"))
[1] 2

唯一的缺点是 pmatch(x, table... 对两个 args 进行了矢量化,但 grep 仅用于第二个 args。所以grep 不能采用模式向量。但是你可以使用stringi,或者sapply

【讨论】:

  • 对我来说“非常烦人”,主要是因为我不知道如何使用它。
  • @zx8754:不是你不明白。 pmatch 确实是被设计破坏了。它的默认行为是愚蠢的,没有开关可以关闭它。由于它的输入是矢量化的,因此您当然希望它能够处理部分匹配,但事实并非如此。 grep 可以满足您的所有需求以及更多功能 - 部分匹配、捕获组、反向引用等。我从来不需要 pmatch,也从未见过它使用过。
【解决方案2】:

根据文档:

nomatch:在不匹配或乘以部分匹配位置返回的值。请注意,它被强制转换为整数。

nomatch 默认为 NA(即,如果有多个部分匹配,则将返回 NA)。

pmatch("me",   c("mean", "median", "mode")) 
[1] NA  # returns NA instead of 1,2 since multiple partial matches

pmatch("mo",   c("mean", "median", "mode")) 
[1] 3   # since single partial match

【讨论】:

  • 为什么这给了NA? pmatch("ed", c("mean", "median", "mode"))
  • 谢谢。所以默认情况下,x 只能使用一次。如果我想允许多个部分匹配,我猜我将不得不为每个单独的字符串调用 pmatch。
  • @zx8754 似乎匹配必须从第二个参数的第一个字符开始
  • @Krisselack 或者你可以使用 grep / 正则表达式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多