【问题标题】:readxl, returning values are slightly off from the values on Excelreadxl,返回值与 Excel 上的值略有不同
【发布时间】:2021-01-31 08:53:37
【问题描述】:

我正在尝试将an Excel file 读入 R。

我使用readxl 包的read_excel 函数和参数col_types = "text",因为Excel 工作表的列包含混合数据类型。

  df <- read_excel("Test.xlsx",sheet="Sheet1",col_types = "text")

但是在数值引入上似乎有非常细微的差别。总是那几个值,所以我认为这是 Excel 中的一些隐藏属性。

  1. 我尝试在 Excel 中将这些值格式化为数字,并尝试在数字后添加 0,但它不起作用。
  2. 我将单元格的数值从 2.3 更改为 2.4,R 读取正确。

【问题讨论】:

    标签: r excel


    【解决方案1】:

    这是floating-point imprecision 的结果,但有点棘手。当您在 R 或 Excel 中输入数字 1.2(例如)时,它不会完全表示为 1.2:

    print(1.2,digits=22)
    ## [1] 1.199999999999999955591
    

    Excel 和 R 通常会尝试通过将打印精度限制在忽略那些浮点值的水平来保护您免受这些细节的影响,如果您使用的是固定精度的浮点值(大多数计算机系统都会这样做),这些细节是不可避免的点不精确。但是,当您显式转换为字符时,R 表示您不想丢失信息,因此它会为您提供所有数字。可以用二进制表示精确表示的数字,例如 2.375,不会获得所有这些额外的数字。

    但是,在这种情况下有一个简单的解决方案:

    readxl::read_excel("Test.xlsx", na="ND")
    

    这告诉 R 字符串“ND”应该被视为一个特殊的“不可用”值,所以你的所有数值都会得到正确处理。当您检查数据时,微小的不精确性仍然存在,但 R 会以与 Excel 相同的方式打印数字。

    我觉得可能有更好的方法来解决这个问题(混合类型的列真的很难处理),但如果你需要“修复”数字的格式,你可以尝试这样的事情:

    x <- c(format(1.2,digits=22),"abc")
    ## [1] "1.199999999999999955591" "abc"                    
    fix_nums <- function(x) {
        nn <- suppressWarnings(as.numeric(x))
        x[!is.na(nn)] <- format(nn[!is.na(nn)])
        return(x)
    }
    fix_nums(x)  
    ## [1] "1.2" "abc"
    

    如果你使用 tidyverse,你可以使用my_data %&gt;% mutate_all(fix_nums)

    【讨论】:

    • 这太迷人了!但是对于我的数据集,NA 值和字符“ND”之间存在区别(还有一些其他字符)。我打算编写一个舍入函数来循环我的数据集,你会以不同的方式处理这个吗?
    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多