【问题标题】:r: rounding when head datar:头部数据时四舍五入
【发布时间】:2018-01-20 15:03:27
【问题描述】:

我无法弄清楚如何让 r 正确显示我的数据头部。这是 Swirl 的作业,所以我必须弄清楚如何以 Swirl 接受的方式编写我的代码作为答案。
Swirl 希望最终的打印输出看起来像这样:

## Pclass   agecat    Sex      N     survivors   perc_survived
## <int>   <fctr>    <chr>   <int>     <int>         <dbl>
##   1    Under 15  female     2         1        50.000000
##   1    Under 15    male     3         3       100.000000
##   1    15 to 50  female    70        68        97.142857
##   1    15 to 50    male    72        32        44.444444
##   1    Over 50   female    13        13       100.000000
##   1    Over 50     male    26         5        19.230769
#

我的代码:

 library(dplyr)
 titanic_4 <- titanic %>% 
  select(Survived, Pclass, Age, Sex) %>%
  filter(!is.na(Age)) %>%
  mutate(agecat = cut(Age, breaks = c(0, 14.99, 50, 150), 
                      include.lowest = TRUE,
                      labels = c("Under 15", "15 to 50",
                                 "Over 50"))) %>%
  group_by(Pclass,agecat,Sex) %>%
  summarize(N=n(), survivors = sum(Survived))%>%
  mutate(perc_survived = (signif((100*survivors/N), digits=8)))

print(titanic_4)

给予:

# A tibble: 18 x 6
# Groups:   Pclass, agecat [9]
   Pclass   agecat    Sex     N survivors perc_survived
    <int>   <fctr>  <chr> <int>     <int>         <dbl>
 1      1 Under 15 female     2         1     50.000000
 2      1 Under 15   male     3         3    100.000000
 3      1 15 to 50 female    70        68     97.142857
 4      1 15 to 50   male    72        32     44.444444
 5      1  Over 50 female    13        13    100.000000
 6      1  Over 50   male    26         5     19.230769
 7      2 Under 15 female    10        10    100.000000
 8      2 Under 15   male     9         9    100.000000
 9      2 15 to 50 female    61        56     91.803279
10      2 15 to 50   male    78         5      6.410256
11      2  Over 50 female     3         2     66.666667
12      2  Over 50   male    12         1      8.333333
13      3 Under 15 female    27        13     48.148148
14      3 Under 15   male    27         9     33.333333
15      3 15 to 50 female    74        33     44.594595
16      3 15 to 50   male   217        29     13.364055
17      3  Over 50 female     1         1    100.000000
18      3  Over 50   male     9         0      0.000000

当我head(titanic_4)时,r对最后一列的数据进行四舍五入(perc_survivied):

# A tibble: 6 x 6
# Groups:   Pclass, agecat [3]
  Pclass   agecat    Sex     N survivors perc_survived
   <int>   <fctr>  <chr> <int>     <int>         <dbl>
1      1 Under 15 female     2         1      50.00000
2      1 Under 15   male     3         3     100.00000
3      1 15 to 50 female    70        68      97.14286
4      1 15 to 50   male    72        32      44.44444
5      1  Over 50 female    13        13     100.00000
6      1  Over 50   male    26         5      19.23077

但是,我希望 R 在 perc_survived 中给我六个小数位,以便它看起来像这样:

## Pclass   agecat    Sex      N     survivors   perc_survived
## <int>   <fctr>    <chr>   <int>     <int>         <dbl>
##   1    Under 15  female     2         1        50.000000
##   1    Under 15    male     3         3       100.000000
##   1    15 to 50  female    70        68        97.142857
##   1    15 to 50    male    72        32        44.444444
##   1    Over 50   female    13        13       100.000000
##   1    Over 50     male    26         5        19.230769

谁能告诉我如何告诉 r 保留小数点后 6 位? 非常感谢!

来自评论:
*也许打印(泰坦尼克号[1:6,])? ——弗洛里安

我尝试了Florian提出的方法,但并没有改变四舍五入的结果

> titanic_4 <- titanic %>% 
+     select(Survived, Pclass, Age, Sex) %>%
+     filter(!is.na(Age)) %>%
+     mutate(agecat = cut(Age, breaks = c(0, 14.99, 50, 150), 
+                         include.lowest = TRUE,
+                         labels = c("Under 15", "15 to 50",
+                                    "Over 50"))) %>%
+     group_by(Pclass,agecat,Sex) %>%
+     summarize(N=n(), survivors = sum(Survived))%>%
+     mutate(perc_survived = (signif((100*survivors/N), digits=8)))
> 
> print(titanic_4[1:6,])
# A tibble: 6 x 6
# Groups:   Pclass, agecat [3]
  Pclass   agecat    Sex     N survivors perc_survived
   <int>   <fctr>  <chr> <int>     <int>         <dbl>
1      1 Under 15 female     2         1      50.00000
2      1 Under 15   male     3         3     100.00000
3      1 15 to 50 female    70        68      97.14286
4      1 15 to 50   male    72        32      44.44444
5      1  Over 50 female    13        13     100.00000
6      1  Over 50   male    26         5      19.23077
> 

关于 Eric Fail 的回答,sprintf 导致列更改为字符。这是 Swirl() 的赋值,swirl 不会接受类型改变。

> titanic_4 <- titanic %>% 
+     select(Survived, Pclass, Age, Sex) %>%
+     filter(!is.na(Age)) %>%
+     mutate(agecat = cut(Age, breaks = c(0, 14.99, 50, 150), 
+                         include.lowest = TRUE,
+                         labels = c("Under 15", "15 to 50",
+                                    "Over 50"))) %>%
+     group_by(Pclass,agecat,Sex) %>%
+     summarize(N=n(), survivors = sum(Survived))%>%
+     mutate(perc_survived = sprintf("%0.6f",(signif((100*survivors/N), digits=8))))
> 
> head (titanic_4)
# A tibble: 6 x 6
# Groups:   Pclass, agecat [3]
  Pclass   agecat    Sex     N survivors perc_survived
   <int>   <fctr>  <chr> <int>     <int>         <chr>
1      1 Under 15 female     2         1     50.000000
2      1 Under 15   male     3         3    100.000000
3      1 15 to 50 female    70        68     97.142857
4      1 15 to 50   male    72        32     44.444444
5      1  Over 50 female    13        13    100.000000
6      1  Over 50   male    26         5     19.230769

使用 option(digits=8) 的建议成功。为了让这个建议起作用,在运行我的代码之前,我必须更改 r 的基本选项,以便它可以四舍五入到正确的位数。我的 r 设置为四舍五入到 5。

> options(digits=8)
> titanic_4 <- titanic %>% 
+     select(Survived, Pclass, Age, Sex) %>%
+     filter(!is.na(Age)) %>%
+     mutate(agecat = cut(Age, breaks = c(0, 14.99, 50, 150), 
+                         include.lowest = TRUE,
+                         labels = c("Under 15", "15 to 50",
+                                    "Over 50"))) %>%
+     group_by(Pclass,agecat,Sex) %>%
+     summarize(N=n(), survivors = sum(Survived))%>%
+     mutate(perc_survived = (round((100*survivors/N),digits=6)))
> 
> head (titanic_4)
# A tibble: 6 x 6
# Groups:   Pclass, agecat [3]
  Pclass   agecat    Sex     N survivors perc_survived
   <int>   <fctr>  <chr> <int>     <int>         <dbl>
1      1 Under 15 female     2         1     50.000000
2      1 Under 15   male     3         3    100.000000
3      1 15 to 50 female    70        68     97.142857
4      1 15 to 50   male    72        32     44.444444
5      1  Over 50 female    13        13    100.000000
6      1  Over 50   male    26         5     19.230769   

非常感谢您的 cmets 和回答。 祝你好运,

画了

【问题讨论】:

  • 可能是print(titanic[1:6,])?
  • 请包含问题和答案中使用的包。 (这对我来说似乎很明显,但初学者可能不够精通,无法知道包括library(dplyr)。)

标签: r decimal rounding swirl


【解决方案1】:
sprintf(c(.8693683839, .7869698963), fmt='%#.6g')
#> [1] "0.869368" "0.786970"

专门针对您的情况,

titanic_4 <- tibble(perc_survived = c(50.000000, 100.000000, 97.142857,
                                      44.444444, 100.000000, 19.230769))
titanic_4
#> # A tibble: 6 x 1
#>   perc_survived
#>           <dbl>
#> 1      50.00000
#> 2     100.00000
#> 3      97.14286
#> 4      44.44444
#> 5     100.00000
#> 6      19.23077
#> > 
> 
titanic_4 <- titanic_4 %>% mutate(perc_survived_6 = sprintf("%0.6f", perc_survived))
titanic_4
#> # A tibble: 6 x 2
#>   perc_survived perc_survived_6
#>           <dbl>           <chr>
#> 1      50.00000       50.000000
#> 2     100.00000      100.000000
#> 3      97.14286       97.142857
#> 4      44.44444       44.444444
#> 5     100.00000      100.000000
#> 6      19.23077       19.230769

或可能更改全局digits

options(digits=8)
titanic_4
#> # A tibble: 6 x 1
#>   perc_survived
#>           <dbl>
#> 1     50.000000
#> 2    100.000000
#> 3     97.142857
#> 4     44.444444
#> 5    100.000000
#> 6     19.230769

【讨论】:

  • 亲爱的 Eric Fail,非常感谢。您设置我的选项(digits=8) 的建议解决了我的舍入问题。
  • 太棒了。很高兴听你这样说。如果此问题解决了您的问题,您应该将其标记为已回答,以便其他用户可以看到您的问题已得到回答。
【解决方案2】:

这个问题的答案是由 Eric Fail 在这个页面上给出的。

使用 options(digits=8) 更改控制台的 Global Digits 选项解决了 head() 中的舍入问题。如需全球选项列表,请访问此网站。 https://stat.ethz.ch/R-manual/R-devel/library/base/html/options.html

我还创建了另一个帖子,展示了我的控制台是如何四舍五入的。 G5W 向我展示了如何通过调整全局数字来解决问题。
How can I tell R to round correctly?

默认情况下,我的 r studio 中的全局数字设置得太低,我无法正确使用 round() 或 signf()。我需要将数字设置为 8 以实现正确的舍入。

谢谢 Eric Fail 和 G5W

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2023-01-12
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多