dplyr :: summarise()函数中的自动舍入

时间:2019-11-21 02:08:17

标签: r dplyr rounding

我想知道是否有任何简单的方法来指定summarisedplyr报告的位数,最好使用本机dplyr或其他tidyverse函数?

这里有一些玩具数据

library(dplyr)

df <- data.frame(group = rep(letters[1:2], each = 10, length.out = 40),
                 large = rnorm(40, 100, 15),
                 small = rnorm(40, 0.5, 0.02))

如果我们随后通过

进行总结
df %>% group_by(group) %>% summarise(mL = mean(large), mS = mean(small)) 

我们得到

#   group    mL    mS
#   <fct> <dbl> <dbl>
# 1 a     104.  0.496
# 2 b      97.6 0.506

请注意,在未指定任何舍入方式的情况下,均值较高的变量已舍入到小数点后一位,而均值较小的变量已舍入到了3位。

现在是否想要将平均值较大的变量也报告到小数点后3位?如果我们包含这样的舍入命令

df %>% group_by(group) %>% summarise(mL = round(mean(large),3), mS = mean(small))

输出没有变化

#   group    mL    mS
#   <fct> <dbl> <dbl>
# 1 a     104.  0.496
# 2 b      97.6 0.506

只有使用format()函数,我们才能得到我们想要的东西

df %>% group_by(group) %>% summarise(mL = format(round(mean(large),3),3), mS = mean(small))

  group      mL    mS
  <fct> <chr>   <dbl>
1 a     103.888 0.496
2 b     97.626  0.506

是否有更简单的方法来做到这一点?理想情况下,使用某种tidyverse函数。

1 个答案:

答案 0 :(得分:1)

这与打印小标题的方式有关。数据框中的实际数字仍然具有所有小数位,只是在打印小标题时不会显示它们。

您可以使用as.data.frameprint.data.frame(),这将显示更多的小数点(取决于您的getOption("digits"))。您还可以更改小标题设置,但我的理解是,这些设置始终基于有效数字而不是小数点(因此,值> 100的小数点将少于值<100) https://tibble.tidyverse.org/reference/formatting.html用于小标题打印选项

所以

df %>% group_by(group) %>% summarise(mL = round(mean(large),3), mS = round(mean(small),3)) %>%
     as.data.frame()

会将值赋予小数点后3位,并且

df %>% group_by(group) %>% summarise(mL = mean(large), mS = mean(small))  %>%
     as.data.frame()

将显示到getOption("digits")小数位(我认为默认值为7)。

还请注意,如果您确实想对多个列进行相同的操作,summarise_at()可能会非常有用,例如

df %>% group_by(group) %>% summarise_at(c("large","small"), ~round(mean(.),3)) %>% 
    print.data.frame()