将值从 0.001 等转换为科学记数法 1e-3 时遇到问题
Posted
技术标签:
【中文标题】将值从 0.001 等转换为科学记数法 1e-3 时遇到问题【英文标题】:trouble with converting values to scientific notation 1e-3 from 0.001 etc 【发布时间】:2016-09-13 01:51:04 【问题描述】:我知道这可能是个愚蠢的问题,但我认为事情应该更清楚。我的意思是将数字从普通格式转换为科学格式,例如从通常的 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)
试用 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
列中保留科学记数法?
【问题讨论】:
您应该做的是保留科学记数法并以编程方式更改标签 【参考方案1】:所有关于这方面的既定智慧似乎都分为两个阵营。一个阵营说在options
中使用scipen
,由于您描述的原因,您不喜欢它。
另一种解决方案是在绘制图形时保留科学记数法并替换刻度线标签。
您可以使用format
和scientific=F
来创建非科学刻度标记标签。本指南展示了如何为不同的 ggplot2
图自定义这些标签:
http://www.sthda.com/english/wiki/ggplot2-axis-ticks-a-guide-to-customize-tick-marks-and-labels
【讨论】:
是的,你是对的。我知道我可以更改 ggplot 的格式,但我希望有一个没有scipen
的替代方案。以上是关于将值从 0.001 等转换为科学记数法 1e-3 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章