R : 寻找一个模式并进行编辑

11 浏览
0 Comments

R : 寻找一个模式并进行编辑

我知道关于添加前导零的所有问题,以及提供的综合回答,例如Q1,Q2,Q3。

但是,至少根据我目前的知识,我无法解决以下问题:

  • 使用正则表达式模式匹配在字符串中添加前导零

    因此,我只想在“-”后的数字中添加前导零。

例如:

代码:

Sam <- c("222-88", "537-457", "652-1", "787-892")

var <- LETTERS[1:4]

DF<- data.frame(Sam, var)

DF

Sam var

1 222-88 A

2 537-457 B

3 652-1 C

4 787-892 D

预期结果:

Sam var

1 222-088 A

2 537-457 B

3 652-001 C

4 787-892 D

我尝试了:

library(stringr)

temp <- DF[str_detect(DF$Sam, "-[0-9]{1,2}$"),] # 找到需要前导零的行

temp

Sam var

1 222-88 A

3 652-1 C

formatC(temp$Sam, width = 2,flag = 0)# 不正确!

0
0 Comments

在上面的代码中,我们可以看到使用了Base R中的sub函数来替换字符串中的特定模式。具体来说,代码首先使用正则表达式"-(\\d)\\b"来匹配字符串中以"-"开头、后跟一个数字并以单词边界结尾的模式。然后,代码使用"-00\\1"来替换匹配到的模式,其中\\1表示正则表达式中的第一个捕获组,即原始数字。这样,所有只有一位数字的模式都被替换为三位数字。

接着,代码使用正则表达式"-(\\d\\d)\\b"来匹配字符串中以"-"开头、后跟两个数字并以单词边界结尾的模式。然后,代码使用"-0\\1"来替换匹配到的模式,其中\\1表示正则表达式中的第一个捕获组,即原始两位数字。这样,所有有两位数字的模式都被替换为三位数字。

最后,代码打印出替换后的结果。

这段代码的出现原因可能是为了将字符串中的特定模式替换为另一种格式的模式。通过使用正则表达式和sub函数,可以方便地实现这种替换操作。

要解决这个问题,可以继续扩展正则表达式和替换字符串的规则,以适应更多模式的替换需求。同时,可以考虑将这段代码封装成一个函数,以便在需要的时候可以方便地调用和复用。

0
0 Comments

问题的出现原因:用户想要在字符串中的数字后面添加前导零来统一格式。

解决方法:有多种解决方法可以实现这个需求。一种方法是使用base R,先通过-将字符串分割,然后使用sprintf将数字转换为numeric类型后添加前导零,并使用paste将分割后的字符串重新组合。另一种方法是使用gsubfn函数进行正则表达式匹配,将数字匹配出来后使用sprintf添加前导零。用户还提问是否可以使用stringr或其他包来实现这个需求,并询问是否有其他更简单的替代方法。

更新:使用gsubfn函数和sprintf方法进行了更新,以避免出现任何错误。最终得到的结果与之前的方法相同。

0
0 Comments

最近在处理一个字符串的问题时,我遇到了一个问题:我需要对一组字符串进行处理,将其中的数字部分进行格式调整。我尝试了一种方法,使用了正则表达式来找到字符串中的数字部分,并用sprintf函数对其进行格式化。然而,我发现在某些情况下这种方法并不起作用。

具体来说,我有一个字符向量Sam,其中包含了一些带有"-数字"格式的字符串。我使用了gregexpr函数和正则表达式"[0-9]+$"来找到每个字符串中的数字部分,并将其存储在一个列表m中。然后,我尝试使用regmatches函数和sprintf函数来对每个数字进行格式化,然后将其替换回原来的字符串。最后,我打印出了经过处理后的Sam向量。

然而,我发现在某些情况下,regmatches函数和sprintf函数的组合并不能正确地替换字符串中的数字部分。具体来说,在某些情况下,sprintf函数似乎无法正确地将数字格式化为我想要的格式。

为了解决这个问题,我思考了一段时间,并进行了一些实验。最终,我发现了问题的原因和解决方法。

问题的原因是,sprintf函数对于字符串中的数字部分的格式化方式是有限制的。具体来说,sprintf函数默认将数字格式化为带有小数点的浮点数。对于我想要的格式,即在数字前面补零并且保持整数形式,sprintf函数并不能直接实现。

解决方法是,在调用sprintf函数之前,先对数字进行一些预处理。具体来说,我使用了unlist函数将数字列表m转换为向量,并调用regmatches函数来获取每个数字。然后,我使用sprintf函数对每个数字进行格式化,并将格式化后的数字列表再次替换回原来的字符串。

通过这种方法,我成功地解决了问题,并得到了我想要的结果。现在,我可以放心地处理这组字符串了。

0