在tibble中控制小数位数显示。理解pillar.sigfig是什么。

16

我有一个csv文件weight.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

如果我这样做

library(readr)
Df <- read_csv('weight.csv')
Df

我明白了

# 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

如果我将该tibble转换为普通数据框,就会看到更多的数字。

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

起初,我认为如果我想要让这个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

因此,我认为 pillar.sigfig 是关于控制有效数字而不是小数位数。

但是:

  • 为什么(第2行,第1列)的72.6显示为72.600?
  • 我能做些什么,或者我能做些什么来获得五个小数位数吗?

1
嗨,回答第二个问题:您可以设置 options(pillar.sigfig = 7)。 第一个问题非常有趣。 还请考虑以下示例:options(pillar.sigfig = 4) tibble(a = 60.1, b = 70.1)options(pillar.sigfig = 5) tibble(a = 60.1, b = 70.1) - Cettt
也许使用更小的测试数据重新表述问题会更有意义。 - Cettt
2个回答

3
这可能有点晚了...3年晚了,但它可能对其他寻找答案的人有所帮助。
问题出在上。它有一种非常主观的表示数据框的方式。我认为,你通常不会感到有必要以这种方式查看你的数据,但如果你确实需要,我经常使用两个选项,这可能只是另一种解决方法。
选项1:使用。
这个简洁的函数强制执行小数。因此,您可以使用以下代码格式化所有要格式化的列:
library(tidyverse)

data <- tribble(
~ 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
)

data <-
  data %>%
  mutate(across(where(is.numeric), ~ num(., digits = 3)))

data
#> # A tibble: 9 × 2
#>      weight weight_selfreport
#>   <num:.3!>         <num:.3!>
#> 1    81.500            81.670
#> 2    72.600            72.595
#> 3    92.900            93.013
#> 4    79.400            79.401
#> 5    94.600            96.642
#> 6    80.200            79.401
#> 7   116.200           113.430
#> 8    95.400            95.735
#> 9    99.500            99.819

选项2:使用表格包

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

  • flextable
  • gt
  • formattable
  • reactable
  • 等等。

下面是一个你可以尝试使用flextable的示例:

library(tidyverse)

data <- tribble(
  
~ 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
)

flextable::flextable(data)

我假设选项1可能是你在寻找的内容。

1
我有同样的问题。使用pillar.sigfig可以解决问题。您还可以与round()一起使用,这样就可以更好地控制结果。但如果最后一位是0,则不会显示它。
我使用的“技巧”是将结果保存在一个变量中,然后使用print.data.frame()。这样就可以正常工作了。但也许还有更简单的解决方案...

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