我的名字如下。我只想在.
之前保留该部分。如何
>name
uc001aaa.3
uc001aac.4
uc001aae.4
uc001aah.4
uc001aai.1
uc001aak.3
uc001aal.1
uc001aam.4
uc001aaq.2
uc001aar.2
如何使用R?
中的regex
或sub
来实现此目的
答案 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"
我正在使用正则表达式[.]
来匹配文字点而不是\\.
,因为我发现它更具可读性。 (如果您有多个级别的解释,这也会有所帮助,但这不是问题。)