如何规范R中相当长的十进制数?

时间:2016-11-22 00:05:50

标签: r dataframe normalization

我有data.frame列表,我需要在.score列进行转换。但是,我为这个转换实现了辅助函数。在我为data.frame的输入列表调用.helperFunc之后,我在第一个,第三个data.frame中得到了奇怪的pvalue格式。如何将相当大的十进制归一化到简单的科学数字?谁能告诉我如何轻松实现这一目标?

玩具数据:

savedDF <- list(
  bar = data.frame(.start=c(12,21,37), .stop=c(14,29,45), .score=c(5,69,14)),
  cat = data.frame(.start=c(18,42,18,42,81), .stop=c(27,46,27,46,114), .score=c(15,5,15,5,134)),
  foo = data.frame(.start=c(3,3,33,3,33,91), .stop=c(26,26,42,26,42,107), .score=c(22,22,6,22,6,7))
)

我得到了这个奇怪的输出:

> .savedDF
$bar
  .start .stop .score                                                                 p.value
1     12    14      5 0.000010000000000000000817488438054070343241619411855936050415039062500
2     21    29     69 0.000000000000000000000000000000000000000000000000000000000000000000001
3     37    45     14 0.000000000000009999999999999999990459020882127560980734415352344512939

$cat
  .start .stop .score p.value
1     18    27     15   1e-15
2     42    46      5   1e-05
3     18    27     15   1e-15
4     42    46      5   1e-05
5     81   114    134  1e-134

$foo
  .start .stop .score                  p.value
1      3    26     22 0.0000000000000000000001
2      3    26     22 0.0000000000000000000001
3     33    42      6 0.0000010000000000000000
4      3    26     22 0.0000000000000000000001
5     33    42      6 0.0000010000000000000000
6     91   107      7 0.0000001000000000000000

我不知道发生了什么,只有第二个data.frame&#39;格式是理想的。如何将p.value列标准化为尽可能简单?

cat的最后一栏被认为是理想的格式,或更精确但简单的科学数字也适合我。

如何针对意外长的十进制数进行此规范化?如何实现我想要的输出?任何的想法 ?非常感谢

1 个答案:

答案 0 :(得分:2)

0是默认的scipen选项。 (有关详细信息,请参阅?options。)您显然已将选项更改为100,这告诉R使用十进制表示法,除非它比科学记数法长100个字符。要恢复默认值,请运行

options(scipen = 0)

至于“所以在我的功能中,我也可以添加这个选项吗?” - 你不应该这样做。在脚本中执行此操作很好,但不适用于功能。功能真的不应该设置用户选项。这可能就是你如何陷入这种混乱 - 你使用的一些功能可能是粗暴地运行options(scipen = 100)并且在你不知道的情况下改变了你的选择。

相关:相反的问题How to disable scientific notation in R?