将值转换为科学计数法1e-3从0.001等的麻烦

时间:2016-09-13 01:51:05

标签: r

我知道这可能是一个愚蠢的问题,但我认为事情应该更清楚。我的意思是将数字从正常格式转换为科学格式,例如从通常的0.001到1e-3格式。

我知道有一些类似的问题但重点是我想在不改变全局options(scipen)的情况下完成此过程。在我的情况下,总是首先更改options(scipen)作为其他值,我不希望它们被更改,这是不好的用法。

这就是我的意思,假设我们有这样的数据

set.seed(12345)
set =rep(rep(c("1","2"),each=5),times=1)
V=rep(seq(1,1.4,0.1),times=2)
value <- replicate(1,c(replicate(2,sort(10^runif(5,-3,0),decreasing=FALSE))))
data_rep <- data.frame(V, value,set)

#> data_rep
#     V       value set
#1  1.0 0.002351715   1
#2  1.1 0.005382811   1
#3  1.2 0.023703932   1
#4  1.3 0.058314556   1
#5  1.4 0.476184589   1
#6  1.0 0.001595635   2
#7  1.1 0.001896175   2
#8  1.2 0.034667861   2
#9  1.3 0.097931107   2
#10 1.4 0.197982134   2

试验1

当我们options(scipen=-10)

#> data_rep
#         V        value set
#1  1.0e+00 2.341224e-02   1
#2  1.1e+00 1.454493e-01   1
#3  1.2e+00 1.918435e-01   1
#4  1.3e+00 4.239548e-01   1
#5  1.4e+00 4.553797e-01   1
#6  1.0e+00 3.155843e-03   2
#7  1.1e+00 9.446831e-03   2
#8  1.2e+00 3.370335e-02   2
#9  1.3e+00 1.524459e-01   2
#10 1.4e+00 9.315600e-01   2

正如我们可以看到的那样,当绘制

时,V列也发生了变化
qplot(data=data_rep,x=V,y=value)

enter image description here

试验2

使用format功能

更改格式
  options(scipen = 0)
    library(dplyr)
    df_format <- data_rep%>%
  mutate(value=as.numeric(format(value,scientific=TRUE,digits=4))) %>%
  mutate(logic=ifelse(value<2e-1,TRUE,FALSE))

#       > df_format
#     V    value set logic
#1  1.0 0.023410   1  TRUE
#2  1.1 0.145400   1  TRUE
#3  1.2 0.191800   1  TRUE
#4  1.3 0.424000   1 FALSE
#5  1.4 0.455400   1 FALSE
#6  1.0 0.003156   2  TRUE
#7  1.1 0.009447   2  TRUE
#8  1.2 0.033700   2  TRUE
#9  1.3 0.152400   2  TRUE
#10 1.4 0.931600   2 FALSE

正如我们所看到的,value列已更改为原始格式。我们如何在value栏中保留科学记数法?

1 个答案:

答案 0 :(得分:2)

所有已确立的智慧似乎都属于两个阵营。一个阵营说在scipen中使用options,由于您所描述的原因,您不喜欢这样做。{/ p>

另一种解决方案是在绘制图表时留下科学记数法并替换刻度标记。

您可以将formatscientific=F一起使用来创建非科学的刻度标记。本指南介绍了如何为不同的ggplot2图表自定义这些标签:

http://www.sthda.com/english/wiki/ggplot2-axis-ticks-a-guide-to-customize-tick-marks-and-labels