如何替换包含'大于'和'小于'的字符串

时间:2014-06-01 19:11:26

标签: regex r

我正在尝试将包含><的字符串替换为R

  datanames<-names(data)
  datanames
  ## [1] BbMx>2.5   BbAv>2.5    BbMx<2.5    BbAv<2.5
  datanames<-gsub("[>]","gt",datanames)
  datanames<-gsub("[<]","lt",datanames)
  datanames<-gsub("[.]","",datanames)
  datanames
  ## [1] BbMx25 BbAv25     BbMx251     BbAv251

我做错了什么?

更新:由于一些奇怪的原因,R没有读取csv的相同字符。就在我的csv中,我用libreoffice阅读

  "BbMx>2.5"  "BbAv>2.5"    "BbMx<2.5"    "BbAv<2.5" 

但是一旦R读取csv,就在

中转换这个字符串
  "BbMx.2.5"   "BbAv.2.5"   "BbMx.2.5.1" "BbAv.2.5.1"

2 个答案:

答案 0 :(得分:3)

我知道@MrFlick已经提供了答案,但只是评论您使用gsub<>字符实施字符和来电的方式不被视为具有特殊含义的字符,因此您不需要将它们放在字符类[ ]中,您可以将它们用作文字。

您可以在这里将gsub功能级联起来。

datanames <- gsub('>', 'gt', gsub('<', 'lt', gsub('\\.', '', datanames)))

答案 1 :(得分:3)

如果你这样做

x <- c("BbMx>2.5","BbAv>2.5","BbMx<2.5","BbAv<2.5")
x <- gsub("[>]","gt",x)
x <- gsub("[<]","lt",x)
x <- gsub("[.]","",x)

你应该

"BbMxgt25" "BbAvgt25" "BbMxlt25" "BbAvlt25"

正如所料。问题是names(data)的输入不是你想象的那样。

R有关于data.frames中有效列名的规则。 R将对这些值运行make.names以尝试生成有效的名称。这包括用句点替换非字母数字值并添加后缀以确保唯一性。

要禁用自动重命名,您可以使用check.names=F功能设置read.table/read.csv并自行重命名。

所以,如果你有

x<-c("BbMx>2.5", "BbAv>2.5", "BbMx<2.5","BbAv<2.5" )

然后

make.names(x, unique=T)
# [1] "BbMx.2.5"   "BbAv.2.5"   "BbMx.2.5.1" "BbAv.2.5.1"

所以最终这与gsub无关。这实际上是关于R如何将原始数据转换为data.frames。