gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:17:04 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why does as_tibble() round floats to the nearest integer?

(1 个回答)


1年前关闭。




我想知道是否有任何简单的方法可以指定 summarise 报告的位数在 dplyr ,理想情况下使用 native 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

请注意,在没有指定任何舍入的情况下,具有较高平均值的变量已四舍五入到小数点后 1 位,而具有较小平均值的变量已四舍五入为 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 功能。

最佳答案

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

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

所以

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()

关于r - dplyr::summarise() 函数中的自动舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58966183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com