我正在尝试将包含>
和<
的字符串替换为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"
答案 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。