为啥 as_tibble() 将浮点数舍入到最接近的整数?

Posted

技术标签:

【中文标题】为啥 as_tibble() 将浮点数舍入到最接近的整数?【英文标题】:Why does as_tibble() round floats to the nearest integer?为什么 as_tibble() 将浮点数舍入到最接近的整数? 【发布时间】:2018-07-17 23:52:14 【问题描述】:

在 dplyr 0.7.4 和 R 3.4.1 中使用 as_tibble 时,我得到以下输出

mtcars %>% aggregate(disp ~ cyl, data=., mean) %>% as_tibble()

哪个输出

# A tibble: 3 x 2
    cyl  disp
  <dbl> <dbl>
1  4.00   105
2  6.00   183
3  8.00   353

同时

mtcars %>% aggregate(disp ~ cyl, data=., mean)

输出

  cyl     disp
1   4 105.1364
2   6 183.3143
3   8 353.1000

并不奇怪,以下

mtcars %>% group_by(cyl) %>% summarise(disp=mean(disp))

再次给予

# A tibble: 3 x 2
    cyl  disp
  <dbl> <dbl>
1  4.00   105
2  6.00   183
3  8.00   353

为什么会发生这种舍入,我该如何避免?

【问题讨论】:

试试mtcars %&gt;% group_by(cyl) %&gt;% summarise(disp=mean(disp)) %&gt;% print.data.frame() 是否有相同结果的 dplyr 选项(即控制台输出中的浮点数不是很漂亮)? 【参考方案1】:

这不是四舍五入,它只是 tibble 以漂亮的方式显示数据的一种方式:

> mtcars %>% 
+   aggregate(disp ~ cyl, data=., mean) %>% 
+   as_tibble() %>% 
+   pull(disp)
[1] 105.1364 183.3143 353.1000

如果你想看到更多的数字,你必须打印一个data.frame:

> mtcars %>% 
+   aggregate(disp ~ cyl, data=., mean) %>% 
+   as_tibble() %>% 
+   as.data.frame()
  cyl     disp
1   4 105.1364
2   6 183.3143
3   8 353.1000

(是的,最后两行没用)

【讨论】:

我明白了。这很好,但在快速“动态”分析的情况下可能会产生误导。有没有 dplyr 选项可以避免它? 当你想要 data.frame 给你的输出时,为什么你必须坚持使用 tibble?它不会改变底层数据,所以它必须是关于表示的。如果是这样的话,那么还有一些更复杂的表包,比如 kableExtra,它们被应用于 knitr 的 kable() 函数。 @SpencerCastro 正如我所说,它在脚本中没有用。这里只是为了说明数据不会随着as_tibble()而改变。 “问题”(如果我们称其为问题)是在使用 summarise 时。我不使用 as_tibble 但正如预期的那样,我得到了一个 tibble。无论如何,好的,我可以使用 as.data.frame 以备不时之需。

以上是关于为啥 as_tibble() 将浮点数舍入到最接近的整数?的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数与字符串连接并舍入到小数点后 2 位

如何在 PHP 中舍入到最接近的 3 倍数? [复制]

将分钟向下舍入到最接近的一刻钟

将 DateTime 舍入到最接近的半小时 [重复]

如何使用 C# 舍入到最接近的千分之一

有没有办法将时间戳向上或向下舍入到最接近的 30 分钟间隔?