【问题标题】:How do I identify a string using a wildcard using R?如何使用 R 使用通配符识别字符串?
【发布时间】:2018-05-21 22:15:51
【问题描述】:

我想计算一些在字符串后包含数字“0”的单词的持续时间,如图所示(我在带有我想要使用的字符的单词下方插入了一个红点)。 有没有类似通配符的东西,所以我只能使用包含这个字符串的单词?

[图片]

【问题讨论】:

  • 马特,欢迎来到 SO!如果您发布 可用 数据而不仅仅是它的图像,这将非常有帮助。这并不意味着您不能包含图像(出于演示目的,正如您所做的那样),但是当我们只是突​​出显示、复制、粘贴和播放具有代表性的样本时,这对我们来说会更容易一些。第二,你的描述不清楚; "0" 在字符串之后 很好,但是什么字符串呢?第三,你试过什么?这可能非常适合正则表达式,但如果您展示您的努力程度,它会有所帮助。 (这不是写我的代码服务。)谢谢!
  • 一些关于如何提出一个很好的可重现问题的参考资料:stackoverflow.com/questions/5963269/…stackoverflow.com/help/mcve

标签: r string wildcard


【解决方案1】:

如果filename 不应该是匹配的一部分,可以利用filename 列来避免正则表达式匹配:

library(dplyr)
library(purrr)

df %>%
  mutate(no_filename = map2_chr(filename, text, ~gsub(.x, '', .y))) %>%
  filter(grepl("^0", no_filename)) %>%
  select(-no_filename)

结果:

  filename      text     value
1       S2  S20XXXXX 0.2065314
2       S3  S30XXXXX 0.8146400
3       S4  S40XXXXX 0.8123895
4       S6  S60XXXXX 0.1111354
5       S7  S70XXXXX 0.1028646
6       S9  S90XXXXX 0.1306957
7       S9  S90XXXXX 0.3203732
8      S10 S100XXXXX 0.1876911

注意:

注意S100XXXXX 匹配,但S101XXXXX 不匹配

数据:

library(dplyr)
df = data.frame(filename = rep(paste0('S', 1:10), each = 5))
set.seed(123)
df = df %>%
  mutate(text = paste0(filename, sample(c(0:5), 50, replace = TRUE), 
                     paste(rep('X', 5), collapse = "")),
         value = runif(50))

【讨论】:

  • 很好的解决方案 - 完全按照要求执行。唯一的问题是 OP 的数据——我可能比这里使用的模拟数据更细微——投了赞成票!
【解决方案2】:

用途:

grep('0',resultado2$TextGridLabel) 

查找带有 0 的行。如果您想查看由搜索参数子集的整个数据集,只需使用括号:

resultado2[grep('0',resultado2$TextGridLabel),] 

【讨论】:

  • 如果TextGridLabel 中有S10XXXXXXX,这将无法正常工作
【解决方案3】:

您应该阅读 ?regex 返回的帮助。它将为您提供在 R 中使用正则表达式的摘要。它还将向您介绍可以使用正则表达式的各种函数。

例如,如果您上面的数据在数据框中,则 df:

grep(x=df$TextGridLabel, pattern="^.*0.+$")

将返回以任何内容开头的所有值的索引,包含 0 并且在 0 之后至少有一个字符。

干杯!

【讨论】:

  • 如果TextGridLabel 中有S10XXXXXXX,这将无法正常工作
  • @user 我不是使用正则表达式的专家...但我无法重现您的主张。以下是我尝试查看会发生什么时得到的结果:> a <-c("S10XXXXXXXX","D10W","D111America")> grep(a,pattern="^.*0.+$")[1] 1 2... 这是我所期望的,我相信所要求的。
  • 我想既然 OP 的问题并不完全清楚,对他真正想要的东西有不同的解释。我认为"S10XXXXXXXX" 不应该匹配,因为S10 之后没有0,其中S10 是一个文件名。如果S10 不是 OP 在“字符串后的数字“0””中引用的字符串,那么我同意您的解决方案按预期工作,但我们在 OP 澄清之前无法确定。
  • @user 啊,是的,你当然是对的。如果字符串没有有助于识别子字符串的结构,或者至少没有您指出的更清晰的问题/要求集,那么这一切都会变得非常棘手。 Matt Addison - 如果 userR 的解释是正确的,我们必须知道起始子字符串是否总是以 S\d{3} 开头,或者它是否可以变化以及如何正确识别它,然后才能在起始子字符串中排除 0。跨度>
【解决方案4】:

下面的代码确实有效,基本上就是我需要的。

resultado2[grep('0',resultado2$TextGridLabel),] 

但是,我想避免在TextGridLabel 中使用诸如S10XXXXXXX 之类的数据。我刚刚编辑了原始帖子,以便新图片更好地说明我想要考虑的内容。

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多