【问题标题】:R Tidyverse spread() function multiple decimal places truncation issueR Tidyverse spread() 函数多个小数位截断问题
【发布时间】:2018-11-14 14:16:46
【问题描述】:

我注意到spread() 中的舍入存在问题(我假设gather())。我用一些虚拟数据(如下)重新创建了这个问题。发生的情况是,当使用 spread() 与超过 4 个小数位的双精度时,点差的输出只有 3 个小数位。

如果有人能对此有所了解,那将非常有帮助,因为我需要保留小数点后 4 位的准确性。

# Loading packages
library(tidyverse)

# Creating a dummy data set.
dummy_data <- tibble(
  day_of_week = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday"),
  person = c("Jack", "Bob", "Bob", "Simon", "Simon"),
  value = c(0.2346, 0.7635, 0.7253, 0.7356, 0.1693)
)

# Spreading the data.
spread_data = dummy_data %>%
  spread(person, value)

【问题讨论】:

  • 我无法复制您的问题。当我 print(spead_data) 时,看起来你是对的,但当我 View(spead_data) 时,我看到了传播数据中的所有小数位。
  • 精度仍然存在:spead_data$Simon 显示它。我不知道更精确地打印小标题。 as.data.frame(spead_data) 也显示出更高的精度。
  • 有趣。好的,所以我然后使用 DT 包(在闪亮的仪表板中)显示这个,所以也许解决方案就在那里? print(spread_data) 可能会截断外观,但不会截断基础值。我会进一步调查。谢谢@AdamSampson 和@bbolker
  • 是的。查看有关该问题的其他 stackoverflow 并将位数更改为您需要的位数:stackoverflow.com/questions/31022331/…

标签: r rounding tidyverse


【解决方案1】:

我在我的 R 环境中重新创建了虚拟变量。

确实当print(spead_data),我明白了:

    day_of_week    Bob   Jack  Simon
  <chr>        <dbl>  <dbl>  <dbl>
1 Friday      NA     NA      0.169
2 Monday      NA      0.235 NA    
3 Thursday    NA     NA      0.736
4 Tuesday      0.764 NA     NA    
5 Wednesday    0.725 NA     NA   

但是,如果您直接访问值,例如 spead_data$Bob 会产生:

[1]     NA     NA     NA 0.7635 0.7253

这是您的 4 位数字!他们从未离开,只是小标题的打印功能有点不同。

我不建议您像@saisaran 建议的那样将您的值转换为因子,之后您将无法正确使用它们。


编辑: 如果你使用print.data.frame(spead_data) 而不是print(spead_data),你会得到你需要的输出:

  day_of_week    Bob   Jack  Simon
1      Friday     NA     NA 0.1693
2      Monday     NA 0.2346     NA
3    Thursday     NA     NA 0.7356
4     Tuesday 0.7635     NA     NA
5   Wednesday 0.7253     NA     NA 

来源:https://community.rstudio.com/t/why-do-tibbles-and-data-frames-display-decimal-places-a-bit-differently/5722

【讨论】:

    【解决方案2】:

    这对你有用吗?

    require(reshape2)
    dummy_data %>%
      melt(id.vars=c("person","day_of_week")) %>% 
      dcast(value+day_of_week~person) %>% 
      select(-value)
    

    您有多个 NA,但这是您的结果:

    day_of_week    Bob   Jack  Simon
    1      Friday     NA     NA 0.1693
    2      Monday     NA 0.2346     NA
    3   Wednesday 0.7253     NA     NA
    4    Thursday     NA     NA 0.7356
    5     Tuesday 0.7635     NA     NA
    

    【讨论】:

      【解决方案3】:

      数据类型有问题,我更改了数据类型:

      dummy_data$value<-as.factor(dummy_data$value)
      # Spreading the data.
      spead_data = dummy_data %>%
        spread(person, value)       
      

      输出:

      # A tibble: 5 x 4
        day_of_week Bob    Jack   Simon 
        <chr>       <fct>  <fct>  <fct> 
      1 Friday      NA     NA     0.1693
      2 Monday      NA     0.2346 NA    
      3 Thursday    NA     NA     0.7356
      4 Tuesday     0.7635 NA     NA    
      5 Wednesday   0.7253 NA     NA   
      

      注意:在使用任何类型时都要谨慎使用因子类型数据

      【讨论】:

      • 谢谢!我不确定因素是否适用于我拥有的真实数据,但我会检查一下。
      • 看起来这不是必需的,而是 print() 函数中的问题,并且数字仍然保留 4 位小数。不过感谢您的意见!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      相关资源
      最近更新 更多