dplyr::summarise() 函数中的自动舍入
Automatic rounding in dplyr::summarise() function
我想知道是否有任何简单的方法来指定 summarise
在 dplyr
中报告的位数,最好使用本机 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 位。
现在想如果我们想要均值较大的变量也报告到小数点后三位?如果我们像这样包含一个四舍五入的命令
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.frame
或 print.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()
我想知道是否有任何简单的方法来指定 summarise
在 dplyr
中报告的位数,最好使用本机 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 位。
现在想如果我们想要均值较大的变量也报告到小数点后三位?如果我们像这样包含一个四舍五入的命令
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.frame
或 print.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()