首页 > 解决方案 > 使用 gsub 函数

问题描述

我有一个具有多个级别的因子,我想在所有数据的数字之间插入一个冒号,但我不知道如何为此使用 gsub 函数。示例我的数据如下所示:

ABCD*0801
ABCD*0701
ABCD*0902
ABCD*0311
ABCD*2001

我想要的是这个:

ABCD*08:01
ABCD*07:01
ABCD*09:02
ABCD*03:11
ABCD*20:01

我在下面使用了这段代码,但我不明白

gsub("(.{4})(.*)$", "\\1:\\2",hladata$DRB1_1)

你能帮我么 ?

标签: rregex

解决方案


这里有两个选项sub(因为每个字符串只有一个匹配项,gsub对于每个字符串的多个匹配项,没有必要):

sub("\\d{2}", "\\1:", x)

这通过反向引用起作用:在第一个参数中匹配的模式(两个digits 的出现)被记住并在替换参数中重复,并将 a:添加到其中。

sub("(?<=\\d{2})(?=\\d{2})", ":", x, perl = TRUE)

这个更复杂的解决方案适用于环视:环视(?<=\\d{2})在匹配的左侧(?=\\d{2})查找两位数,而在右侧查找两位数。在两个环视匹配的地方,:插入 a。

由于量化表达式,您使用的代码不起作用;您需要将其更改为,{7}因为在要插入的点之前有七个字符:。它的工作方式类似于上面的第二个选项,即通过反向引用:\\1记住并重复在第一个捕获组中捕获的前七个字符,(...)而第二个反向引用\\2记住并重复第二个捕获组;在它们之间:添加。

gsub("(.{7})(.*)$", "\\1:\\2", x)

数据:

x <- as.factor(c("ABCD*0801",
                 "ABCD*0701",
                 "ABCD*0902",
                 "ABCD*0311",
                 "ABCD*2001"))

推荐阅读