控制小数位数显示在小标题中。了解 pillar.sigfig 的作用

mja*_*ews 8 r tidyverse tibble

我有一个weight.csv包含以下内容的 csv 文件。

weight,weight_selfreport
81.5,81.66969147005445
72.6,72.59528130671505
92.9,93.01270417422867
79.4,79.4010889292196
94.6,96.64246823956442
80.2,79.4010889292196
116.2,113.43012704174228
95.4,95.73502722323049
99.5,99.8185117967332
Run Code Online (Sandbox Code Playgroud)

如果我做

library(readr)
Df <- read_csv('weight.csv')
Df
Run Code Online (Sandbox Code Playgroud)

我得到

# A tibble: 9 x 2
  weight weight_selfreport
   <dbl>             <dbl>
1   81.5              81.7
2   72.6              72.6
3   92.9              93.0
4   79.4              79.4
5   94.6              96.6
6   80.2              79.4
7  116.              113. 
8   95.4              95.7
9   99.5              99.8
Run Code Online (Sandbox Code Playgroud)

如果我将该小标题转换为普通数据框,我会看到更多数字。

as.data.frame(Df)
  weight weight_selfreport
1   81.5          81.66969
2   72.6          72.59528
3   92.9          93.01270
4   79.4          79.40109
5   94.6          96.64247
6   80.2          79.40109
7  116.2         113.43013
8   95.4          95.73503
9   99.5          99.81851
Run Code Online (Sandbox Code Playgroud)

最初我想,如果我想为 tibble 获得这种类型的显示,我想我会这样做options(pillar.sigfig = 5)

然而,这不是它的作用。

options(pillar.sigfig = 5)
Df
# A tibble: 9 x 2
   weight weight_selfreport
    <dbl>             <dbl>
1  81.5              81.670
2  72.600            72.595
3  92.9              93.013
4  79.4              79.401
5  94.6              96.642
6  80.2              79.401
7 116.2             113.43 
8  95.4              95.735
9  99.5              99.819
Run Code Online (Sandbox Code Playgroud)

所以我认为这pillar.sigfig是关于控制有效数字而不是小数位。

很好但是

  • 为什么 (row 2, col 1) 72.6 显示为 72.600?
  • 我能做什么,或者我能做什么,才能得到五位小数?

Dan*_*l D 5

这可能有点晚了……晚了三年,但它可能会帮助其他人寻找答案。

\n

问题出在tibble. 它以一种非常固执己见的方式来代表 dfs。我认为,您通常不觉得有必要以这种方式查看数据,但如果您这样做,我经常使用的两个选项可能只是另一种解决方法。

\n

选项 1:使用num()

\n

这个简洁的函数强制使用小数。因此,您可以mutate()使用以下内容设置要格式化的所有列:

\n
library(tidyverse)\n\ndata <- tribble(\n~ weight, ~ weight_selfreport,\n81.5,81.66969147005445,\n72.6,72.59528130671505,\n92.9,93.01270417422867,\n79.4,79.4010889292196,\n94.6,96.64246823956442,\n80.2,79.4010889292196,\n116.2,113.43012704174228,\n95.4,95.73502722323049,\n99.5,99.8185117967332\n)\n\ndata <-\n  data %>%\n  mutate(across(where(is.numeric), ~ num(., digits = 3)))\n\ndata\n#> # A tibble: 9 \xc3\x97 2\n#>      weight weight_selfreport\n#>   <num:.3!>         <num:.3!>\n#> 1    81.500            81.670\n#> 2    72.600            72.595\n#> 3    92.900            93.013\n#> 4    79.400            79.401\n#> 5    94.600            96.642\n#> 6    80.200            79.401\n#> 7   116.200           113.430\n#> 8    95.400            95.735\n#> 9    99.500            99.819\n
Run Code Online (Sandbox Code Playgroud)\n

选项 2:使用表包

\n

通常,当我检查一个时tibble,是因为它包含我想要报告的结果。因此,我使用许多表生成器包之一,例如

\n
    \n
  • flextable,
  • \n
  • gt,
  • \n
  • formattable,
  • \n
  • reactable,
  • \n
  • ETC。
  • \n
\n

这是您可以尝试使用的示例flextable

\n
library(tidyverse)\n\ndata <- tribble(\n  \n~ weight, ~ weight_selfreport,\n81.5,81.66969147005445,\n72.6,72.59528130671505,\n92.9,93.01270417422867,\n79.4,79.4010889292196,\n94.6,96.64246823956442,\n80.2,79.4010889292196,\n116.2,113.43012704174228,\n95.4,95.73502722323049,\n99.5,99.8185117967332\n)\n\nflextable::flextable(data)\n
Run Code Online (Sandbox Code Playgroud)\n

我认为选项 1可能就是您正在寻找的。

\n


小智 1

我有同样的问题。使用pillar.sigfig 会有所帮助。您还可以将它与 round() 一起使用,并且您有更多的控制权。但如果最后一个数字为0,则不会显示。

我使用的“技巧”是将结果保存在变量中,然后使用 print.data.frame()。然后就可以正常工作了。但也许有一个更简单的解决方案......