R:用gsub代替用科学记数法中的数字强制的字符串

时间:2014-02-24 11:01:10

标签: regex r

我需要将som数据导出到另一种编程语言的文本文件中,其中数字不能超过14位。并非所有元素都需要以逗号分隔,因此这就是我使用此方法的原因。

问题是gsub在强制转换为字符串时没有重新计算数字42,科学记数法选项scipen设置得足够低,因此42用电子记数法打印。

此处scipen=-10所以42以电子记数法打印。

x <- 4.2e+1    # The meaning of life
options(scipen = -10) 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=TRUE)
[1] "4.2e+01"
gsub(pattern=x,replacement=paste(",",x),x,useBytes=FALSE)
[1] "4.2e+01"

就像gsub不会重新匹配。我也试过了,

gsub(pattern=x,replacement=paste(",",x),as.character(x))

但没有运气。

在以下两个示例gsub按预期行事,scipen=0足够高,可确保将42打印为42

x <- 4.2e+1    # Still the meaning of life
options(scipen = 0) 
gsub(pattern=x,replacement=paste(",",x),x,useBytes=TRUE)
[1] ", 42"
gsub(pattern=x,replacement=paste(",",x),x,useBytes=FALSE)
[1] ", 42"

正如您所看到的,useBytes选项也没有帮助。有人可以告诉我我没有得到的东西。

感谢。

1 个答案:

答案 0 :(得分:0)

字符.+是预定义的正则表达式字符。因此,它们不是按字面解释的。您必须在模式中转义这些字符(使用\\)。然后,它会工作。

x <- 4.2e+1    # The meaning of life
options(scipen = -10) 

x_pat <- gsub("(\\+|\\.)", "\\\\\\1", x)
# [1] "4\\.2e\\+01"

gsub(x_pat, paste(",", x), x)
# [1] ", 4.2e+01"

另一种可能性是使用参数fixed = TRUE。这与模式字符串匹配。

gsub(x, paste(",", x), x, fixed = TRUE)
# [1] ", 4.2e+01"