在字母 S 和列数据框中的任何数字之间添加符号

Add symbol between the letter S and any number in a column dataframe

我正在尝试在字母 S 和数据框列中的任何数字之间添加一个 -。所以,这是一个例子:

VariableA

TRS34
MMH22
GFSR104
GS23
RRTM55
P3
S4

我想要的输出是:

VariableA
TRS-34
MMH22
GFSR104
GS-23
RRTM55
P3
S-4

我正在尝试使用 gsub:

gsub('^([a-z])-([0-9]+)$','\1d\2',myDF$VariableA)

但这不起作用。

我该如何解决这个问题? 谢谢!

您的 ^([a-z])-([0-9]+)$ 正则表达式尝试匹配以字母开头、然后是 - 和一个或多个数字的字符串。这行不通,因为字符串中没有连字符,您想将其引入字符串中。

您可以使用

gsub('(S)([0-9])', '\1-\2', myDF$VariableA)

(S)([0-9]) 正则表达式匹配并捕获 S 到第 1 组 (</code>),然后任何数字被捕获到第 2 组 (<code>) 和替换模式是组值的串联,中间有一个连字符。 如果预期只有一个替换,请将 gsub 替换为 sub.

参见regex demo and the online R demo

其他变化:

gsub('(S)(\d)', '\1-\2', myDF$VariableA)             # \d also matches digits
gsub('(?<=S)(?=\d)', '-', myDF$VariableA, perl=TRUE)   # Lookarounds make backreferences redundant

如果您设置 perl=TRUE:

,您也可以使用回顾
> gsub('(?<=S)([0-9]+)', '-\1', myDF$VariableA, perl=TRUE)
[1] "TRS-34"  "MMH22"   "GFSR104" "GS-23"   "RRTM55"  "P3"      "S-4"    
> 

这是我喜欢使用的版本 sub:

myDF$VariableA <- gsub('S(\d)', 'S-\1', myDF$VariableA)

这只需要使用一个捕获组。

使用stringr

library(stringr)
str_replace_all(myDF$VariableA, 'S(\d)', 'S-\1')