如何在R中使用正则表达式编辑名称?

时间:2014-06-08 14:55:30

标签: r

我的名字如下。我只想在.之前保留该部分。如何

>name
    uc001aaa.3
    uc001aac.4
    uc001aae.4
    uc001aah.4
    uc001aai.1
    uc001aak.3
    uc001aal.1
    uc001aam.4
    uc001aaq.2
    uc001aar.2

如何使用R?

中的regexsub来实现此目的

2 个答案:

答案 0 :(得分:5)

我认为这肯定是重复的,但尽管有gsub个问题,但我无法轻易找到(例如https://stackoverflow.com/questions/23844473/exclude-a-pattern-in-all-collumn-names-in-r)。 更新:具有讽刺意味的是,最近的一个是OP几天前提出的问题,How to trim the column name of the matrix? ......

反正

gsub("\\.[0-9]$","",name)

做你想做的事;

  • \\.指定一个文字.字符(需要一个反斜杠来指定.是文字而不是“任何字符”;第二个是保护第一个字符所必需的!) 。正如@MatthewLundberg所指出的,你也可以在这里使用[.].按字面解释,而不是作为“任何字符”,在范围[])范围内。
  • [0-9]表示“0-9范围内的单个字符”(不像您认为的那样,字符串的前9个字符)
  • $表示“字符串结束”

因此,这将从每个字符串的末尾删除一个点加一个数字。在点之前有多少个字符并不重要。另一方面,如果您可能有多个数值,例如foo.123,您需要"\\.[0-9]+$代替+表示“前一个模式中的一个或多个”)

答案 1 :(得分:4)

这是一个strsplit方法,用于分隔.个字符的字符串,并保留第一部分:

sapply(strsplit(name, '[.]'), '[', 1)
## [1] "uc001aaa" "uc001aac" "uc001aae" "uc001aah" "uc001aai" "uc001aak" "uc001aal" "uc001aam" "uc001aaq" "uc001aar"

我正在使用正则表达式[.]来匹配文字点而不是\\.,因为我发现它更具可读性。 (如果您有多个级别的解释,这也会有所帮助,但这不是问题。)