首页 > 解决方案 > R:禁用科学记数法

问题描述

我正在使用 R 编程语言。在一些更大的数据上,我尝试了以下代码(制作决策树):

#load library
library(rpart)
    
    #generate data
    a = rnorm(100, 7000000, 10)
    
    b = rnorm(100, 5000000, 5)
    
    c = rnorm(100, 400000, 10)
    
    group <- sample( LETTERS[1:2], 100, replace=TRUE, prob=c(0.5,0.5) )
    
    group_1 <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.25, 0.25, 0.25, 0.25) )
    
    
    d = data.frame(a,b,c, group, group_1)
    d$group = as.factor(d$group)
    d$group_1 = as.factor(d$group_1)
    
#fit model
    tree <- rpart(group ~ ., d)
    
#visualize results
    plot(tree)
    
    text(tree, use.n=TRUE, minlength = 0, xpd=TRUE, cex=.8)

在视觉输出中,数字以科学计数法显示(例如 4.21e+06)。有没有办法禁用它?

我在stackoverflow上查阅了这个先前的答案:如何禁用科学记数法?

然后我尝试了以下命令:options(scipen=999)

但这似乎并没有解决问题。

有人可以告诉我我做错了什么吗?

谢谢

标签: rdata-visualizationdata-manipulationdecision-tree

解决方案


我认为该labels.rpart函数具有硬编码的科学记数法:它使用调用的私有函数formatg使用格式进行sprintf()格式化%g,并且该函数忽略options(scipen). 您可以通过替换formatg为更好的功能来覆盖它。这是一种危险的方法:

oldformatg <- rpart:::formatg
assignInNamespace("formatg", format, "rpart")

替换formatg为标准format功能。(这肯定会产生危险的副作用,所以之后你应该使用

assignInNamespace("formatg", oldformatg, "rpart")

更好的解决方案是重新调整数据。 rpart仅对大数字切换到科学记数法,因此您可以将坏数字除以 1000 或 1000000,并将它们描述为不同的单位。对于您的示例,这对我有用:

library(rpart)

#generate data
set.seed(123)
a = rnorm(100, 7000000, 10)/1000

b = rnorm(100, 5000000, 5)/1000

c = rnorm(100, 400000, 10)/1000

group <- sample( LETTERS[1:2], 100, replace=TRUE, prob=c(0.5,0.5) )

group_1 <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.25, 0.25, 0.25, 0.25) )


d = data.frame(a,b,c, group, group_1)
d$group = as.factor(d$group)
d$group_1 = as.factor(d$group_1)

#fit model
tree <- rpart(group ~ ., d)

#visualize results
plot(tree)

text(tree, use.n=TRUE, minlength = 0, xpd=TRUE, cex=.8)

reprex 包(v0.3.0)于 2021-01-27 创建


推荐阅读