【问题标题】:R: grepl select first charachter on a stringR:grep选择字符串上的第一个字符
【发布时间】:2016-01-20 11:18:36
【问题描述】:

我提前道歉,这可能是一个重复的问题。但是,我只是在stackoverflow上花了最后两个小时,似乎找不到解决方案。

我想使用grepl 来检测以数字开头的行,这就是我尝试使用的方法,但它没有给我正确的答案:

   grep.numeric=as.data.frame(grepl("^[:digit:]",df_mod$name))

我猜问题出在正则表达式"^[:digit:]",但我想不通。

更新

我的数据框看起来像这样,它很大,但下面是一个示例:

  ID       mark         name
   1       whatever     name product
   2       whatever     10 product
   3       whatever     250 product
   4       another_mark other product

我想检测名称以数字开头的产品。

更新 2

在下面的示例中应用 grep.numeric=grepl("^[[:digit:]]",df_mod$name) 给我正确的答案是:

    grep.numeric
   [1] FALSE  TRUE  TRUE FALSE

但是,让我发疯的是当我将这个函数应用到我的真实数据框时:

   grep.numeric=grepl("^[[:digit:]]",df_mod[217,]$nom)

给我这个结果:

   grep.numeric
   [1] FALSE

但实际上,我拥有的是这样的:

   df_mod[217,]$nom
   [1]  100 lipo 30 gélules

请帮帮我。

【问题讨论】:

  • 试试^[[:digit:]] - 它必须在字符类中
  • 我使用了一个 Perl 相关问题作为源副本,但它也与 POSIX 字符类有关,因此在这里也应该相关。
  • @Wiktor Stribiżew 我将"^[:digit:]" 切换为"^[[:digit:]]",但没有任何改变。
  • 你能提供dput(df_mod[217,]$nom)吗?
  • @DavidArenburg ,它有效!!!!你真是个天才:grepl("^[[:digit:]]", trimws(df_mod[217,]$nom)) [1] TRUE。非常感谢。您能否将您的评论切换为答案,以便其他用户可以从中获利。

标签: regex r dataframe grepl


【解决方案1】:

显然,您的某些值有前导空格,因此您可以将正则表达式修改为(或类似的)

grepl("^\\s*[[:digit:]]", df_mod$name)

或者使用内置的trimws函数

grepl("^[[:digit:]]", trimws(df_mod$name))

【讨论】:

  • 是的,值中的前导空格导致了问题。 grepl("^[[:digit:]]", trimws(df_mod$name)) 很有魅力,谢谢。
  • 您是否也尝试过grepl("^\\s*[[:digit:]]", df_mod$name)?我更喜欢它。
  • 是的,它也有效!!我现在有两个解决方案:)
猜你喜欢
  • 2010-10-01
  • 1970-01-01
  • 2020-11-06
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多