如何在tibbles中将科学计数法转换为十进制?

5

虽然很基础,但我找不到任何答案:如何在tibble中禁用科学计数法,并显示小数?

我的数据

我有一个简单的tibble,是通过lm() %>% broom::tidy()得到的。

library(tidyverse)

## I used dput() to get this:

tidy_lm_output <- structure(list(term = c("(Intercept)", "mood", "sleep"), estimate = c(-0.00000000000000028697849703988, 
-0.0746522106739049, 0.835867664974019), std.error = c(0.0319620048196539, 
0.0464197056030362, 0.0464197056030362), statistic = c(-0.00000000000000897873893265334, 
-1.60820086435494, 18.006742053085), p.value = c(0.999999999999993, 
0.108628280589954, 9.41480010964234e-53)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))

> tidy_lm_output
## # A tibble: 3 x 5
##  term         estimate std.error statistic   p.value
##   <chr>           <dbl>     <dbl>     <dbl>     <dbl>
## 1 (Intercept) -2.87e-16    0.0320 -8.98e-15 10.00e- 1
## 2 mood        -7.47e- 2    0.0464 -1.61e+ 0  1.09e- 1
## 3 sleep        8.36e- 1    0.0464  1.80e+ 1  9.41e-53

奇怪的是,只有“std.error”列以小数形式显示,而其他所有列都以科学计数法显示。

我希望所有列都以小数形式显示信息,同时仍然作为tibble呈现。

尝试解决问题

  • 常用的options(scipen=999)解决方案不起作用。
  • 使用format(scientific = FALSE)也没有效果。

在其他地方提出的这些问题

  • 某人在这里提出了这个问题,但没有得到答案。

你真的想在你的p值列中有53个零吗?我认为你不想。 - Hong Ooi
不需要五十三个零,但是一些四舍五入的数字也可以让我满意。如果这个数字实际上就是0,那也没关系。我只想要一个可解释的显示。 - Emman
2个回答

8

您可以使用 options(pillar.sigfig = 5) 控制打印的有效数字位数。

tidy_lm_output
# A tibble: 3 x 5
  term           estimate std.error   statistic    p.value
  <chr>             <dbl>     <dbl>       <dbl>      <dbl>
1 (Intercept) -2.8698e-16  0.031962 -8.9787e-15 1.0000e+ 0
2 mood        -7.4652e- 2  0.046420 -1.6082e+ 0 1.0863e- 1
3 sleep        8.3587e- 1  0.046420  1.8007e+ 1 9.4148e-53

如需了解有关如何格式化tibble的更多信息,请参阅help(format.tbl)

但是,如果您只想四舍五入这些数字,则可以执行以下操作:

tidy_lm_output %>%
  mutate_if(is.numeric, round, 5)

# A tibble: 3 x 5
  term        estimate std.error statistic p.value
  <chr>          <dbl>     <dbl>     <dbl>   <dbl>
1 (Intercept)   0         0.0320      0      1    
2 mood         -0.0746    0.0464     -1.61   0.109
3 sleep         0.836     0.0464     18.0    0    

1
我所寻找的是你答案的第二部分。 - Emman
4
如果mutate_if被弃用(现在已标记为过时),mutate_if行的新首选语法是mutate(across(where(is.numeric), round, 5)) - Dan Villarreal

3

format 是一个基础函数,不支持 tibbles。因此,在使用它之前,需要先将 tibble 转换为数据框:

Tidyverse 管道风格

https://style.tidyverse.org/pipes.html

my_formatted_df <- my_tibble %>% as.data.frame() %>% format(scientific=FALSE)

嵌套函数风格

my_formatted_df <- format(as.data.frame(my_tibble), scientific = FALSE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接