dplyr汇总的有效位数

时间:2018-01-19 21:53:05

标签: r dplyr

我无法通过汇总获得所需的小数位数。这是一个简单的例子:

test2  <- data.frame(c("a","a","b","b"), c(245,246,247,248))
library(dplyr)
colnames(test2)  <- c("V1","V2")
group_by(test2,V1) %>% summarise(mean(V2))

数据框是:

  V1  V2
1  a 245
2  a 246
3  b 247
4  b 248

输出结果为:

 V1     `mean(V2)`
 <fctr>      <dbl>
1 a             246
2 b             248

我希望它能给我包括小数位的方法(即245.5和247.5)

3 个答案:

答案 0 :(得分:2)

由于使用的是dplyr工具,因此结果输出实际上是一个小标题,默认情况下,该标题会打印带有3个有效数字的数字(请参阅选项pillar.sigfig)。这与句点后的位数不同。要获取后者,只需将其转换为data.frame:as.data.frame

请注意,tibble的有效数字的概念有些复杂,它并不表示表示句点之后的多少位数,而是具有给定准确表示形式所需的最小位数的数量(我认为是99.9%,请参见discussion here)。

这意味着打印的位数取决于您的号码的“大小”:

library(tibble)
packageVersion("tibble")
#> [1] '2.1.3'
packageVersion("pillar")
#> [1] '1.4.2'
tab <- tibble(x = c(0.1234, 1.1234, 10.1234, 100.1234, 1000.1234))

options(pillar.sigfig=3)
tab
#> # A tibble: 5 x 1
#>          x
#>      <dbl>
#> 1    0.123
#> 2    1.12 
#> 3   10.1  
#> 4  100.   
#> 5 1000.

options(pillar.sigfig=4)
tab
#> # A tibble: 5 x 1
#>           x
#>       <dbl>
#> 1    0.1234
#> 2    1.123 
#> 3   10.12  
#> 4  100.1   
#> 5 1000.

as.data.frame(tab)
#>           x
#> 1    0.1234
#> 2    1.1234
#> 3   10.1234
#> 4  100.1234
#> 5 1000.1234

reprex package(v0.3.0)于2019-08-21创建

答案 1 :(得分:1)

这是一个解决方案 -

test2  <- data.frame(c("a", "a", "b", "b"), c(245, 246, 247, 248))
library(dplyr)
colnames(test2)  <- c("V1", "V2")
group_by(test2, V1) %>% 
  dplyr::summarise(mean(V2)) %>% 
  dplyr::mutate_if(is.numeric, format, 1)
#> # A tibble: 2 x 2
#>   V1    `mean(V2)`
#>   <fct> <chr>     
#> 1 a     245.5     
#> 2 b     247.5

reprex package(v0.1.1.9000)于2018-01-20创建。

答案 2 :(得分:0)

我认为最简单的解决方案如下:

test2  <- data.frame(c("a","a","b","b"), c(245,246,247,248))
library(dplyr)
colnames(test2)  <- c("V1","V2")
group_by(test2,V1) %>% summarise(`mean(V2)` = sprintf("%0.1f",mean(V2)))
# A tibble: 2 x 2
  V1    `mean(V2)`
  <fct> <chr>     
1 a     245.5     
2 b     247.5