R gsub用退格替换模式

R gsub用退格替换模式,r,gsub,R,Gsub,我有一个数据集,其中一列包含一个带有年份的标签(OldLabel),我想创建另一列,只包含标签,而不包含年份(NewLabel)。我编写了以下代码,但它在新标签的末尾留下了一个空格 data["NewLabel"] <- gsub("20..", "", data$OldLabel) #removes any part of the OldLabel column that starts with 20 and ends with 2 digits, e.g: 2011 or 2008

我有一个数据集,其中一列包含一个带有年份的标签(
OldLabel
),我想创建另一列,只包含标签,而不包含年份(
NewLabel
)。我编写了以下代码,但它在新标签的末尾留下了一个空格

data["NewLabel"] <- gsub("20..", "", data$OldLabel)
#removes any part of the OldLabel column that starts with 20 and ends with 2 digits, e.g: 2011 or 2008
data[“NewLabel”]尝试以下操作:

 data["NewLabel"] <- gsub("[ ]{0,1}20[[:digit:]]{2}[ ]{0,1}", "", data$OldLabel)

data[“NewLabel”]查看一些
OldLabel
的示例会有所帮助。如果您想替换“20”+“2个以上的数字”,一个更好的正则表达式是“20\\d{2}”。或者
gsub(“20\\d\\d”,data$OldLabel)
,它非常清楚地显示了模式中表示的两个数字,这没有@neilfws那么优雅。我将使用@shawneman的建议来保持可读性。谢谢你们两位,这是一个比我拥有的更健壮、更优雅的模式。另请参见
trimws
,它删除了字符串开头或结尾的空白。如果需要,您可以使用此函数包装
gsub
的输出,尽管按照42-的建议编写更智能的正则表达式可能是一种更好的方法。这样在删除部分后仍会留下一个空间。你能解释一下你的答案吗?
“\\1”
应该做什么?这可能是您想要的,请删除任一侧带有可选空格的任何数字。请尝试新选项。谢谢!在我的模式的两边添加
\\s*
正是我所需要的。这不会将其修改限制为4位字符串,而是会删除每一位:一位、对位、三位和年位。你的假设是关于gsub如何工作的问题。我再说一遍(现在用你修改过的例子演示一下)。。。你不需要背格啊,我明白。谢谢你的澄清。我应该更仔细地阅读你的答案。对于子孙后代,我最终得出以下结论,这是您的答案、艾丹·加夫伦斯基的答案和肖恩·梅汉的评论的一个组合:
data[“NewLabel”]
test <- c("2012 Valley Summer", "Valley Summer 2014")
gsub("[ ]{0,1}20[[:digit:]]{2}[ ]{0,1}", "", test)
#[1] "Valley Summer" "Valley Summer"
data["NewLabel"] <- gsub("\\s*[0-9]\\s*", "", data$OldLabel)