【问题标题】:Preserving large numbers保留大数
【发布时间】:2012-05-29 12:20:52
【问题描述】:

我正在尝试读取第一列中包含条形码的 CSV 文件,但是当 R 将其放入 data.frame 时,它​​会将 1665535004661 转换为 1.67E+12

有没有办法以整数格式保存这个数字?我尝试分配一个"double" 的类,但这不起作用,也没有分配一个"character" 的类。一旦它采用1.67E+12 格式,任何将其转换回整数的尝试都会返回167000000000

【问题讨论】:

    标签: r csv import precision numeric


    【解决方案1】:

    我倾向于在每个脚本的开头使用options(scipen = 9999999999)。将数字输出到大量小数位而不是科学格式。您可以将“9”的数量更改为要显示的小数位数。有一种方法可以在全局选项中设置它,但我不是 100% 确定如何。

    【讨论】:

      【解决方案2】:

      你可以在做的时候使用数字参数 read.csv。比如:

      read.csv(x, sep = ";", numerals = c("no.loss")) Where x is your data.
      

      这会保留长整数的值,并且在您导入数据时不会弄乱它们的表示。

      【讨论】:

        【解决方案3】:

        接上你在cmets中说的,你可以通过在read.table()中指定colClasses直接将文本导入为字符。例如:

        num <- "1665535004661"
        dat.char <- read.table(text = num, colClasses="character")
        str(dat.char)
        #------
        'data.frame':   1 obs. of  1 variable:
         $ V1: chr "1665535004661"
        dat.char
        #------
                     V1
        1 1665535004661
        

        或者(以及用于其他用途),您可以在options() 下指定digits 变量。默认值为 7 位,可接受的范围为 1-22。需要明确的是,设置此选项不会更改或更改基础数据,它仅控制打印时它在屏幕上的显示方式。来自?options 的帮助页面:

        controls the number of digits to print when printing numeric values. It is a suggestion only.
        Valid values are 1...22 with default 7. See the note in print.default about values greater than
        15.
        

        举例说明:

        options(digits = 7)
        dat<- read.table(text = num)
        
        dat
        #------
                    V1
        1 1.665535e+12
        
        options(digits = 22)
        dat
        #------
                     V1
        1 1665535004661
        

        为了完全充实这一点并考虑到不宜设置全局设置的情况,您可以将数字直接指定为print(foo, digits = bar) 的参数。您可以在?print.default 下阅读更多相关信息。这就是约翰在他的回答中所描述的,因此应该归功于他阐明了这种细微差别。

        【讨论】:

          【解决方案4】:

          它不是“1.67E+12 格式”,它只是不会完全使用默认值打印。 R 读得很好,整数就在那里。

          x <- 1665535004661
          > x
          [1] 1.665535e+12
          > print(x, digits = 16)
          [1] 1665535004661
          

          看,数字一直都在那里。除非您有大量的数字,否则它们不会丢失。对您输入的内容进行排序将正常工作,您只需使用数字选项显式调用 print() 即可查看您的 data.frame,而不是通过键入名称来隐式显示。

          【讨论】:

          • 这基本上覆盖了我在下面讨论的options() 方法。作为参考,人们应该阅读并注意 ?print.default 中的警告,因为 >= 16 位的实现开始成为特定于平台的问题,因为 sprintf() 的实现开始根据底层 C 代码而有所不同。
          • 如果使用 options() 也是如此。它只是一个输出默认值。我认为最好在回答中明确说明这一点。因为它是相当模糊的。试图天真地阅读它我想知道数字选项是否只是改变保留了多少数字,它们是如何读入的?......什么?
          • 好点 - 编辑我的答案更明确。如果您认为有必要,请随时进一步调整。干杯! - 追逐
          【解决方案5】:

          由于您没有对该值执行算术运算,因此字符是合适的。您可以使用 colClasses 参数为每​​一列设置不同的类,这可能比使用所有字符更好。

          数据.csv:

          a,b,c
          1001002003003004,2,3
          

          读取字符,然后读取整数:

          x <- read.csv('test.csv',colClasses=c('character','integer','integer'))
          x
                           a b c
          1 1001002003003004 2 3
          
          
          mode(x$a)
          [1] "character"
          
          mode(x$b)
          [1] "numeric"
          

          【讨论】:

            【解决方案6】:

            从 ?is.integer 页面:

            "请注意,R 的当前实现使用 32 位整数作为整数向量,因此可表示整数的范围被限制在大约 +/-2*10^9?

            1665535004661L > 2*10^9 [1] 是的

            你想要打包 Rmpfr。

            library(Rmpfr)
            x <- mpfr(15, precBits= 1024)
            

            【讨论】:

              【解决方案7】:

              尝试使用 colClasses="character"

              read.csv("file.csv", colClasses = "character")
              

              http://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html

              看看这个链接。

              【讨论】:

                【解决方案8】:

                看看int64 包:Bringing 64-bit data to R

                【讨论】:

                • 有没有办法将其作为角色导入?我不需要用它做数学,我只需要对它进行排序。
                猜你喜欢
                • 1970-01-01
                • 2011-03-30
                • 1970-01-01
                • 2015-07-19
                • 2015-06-05
                • 2010-12-20
                • 1970-01-01
                • 2012-05-16
                • 2020-11-18
                相关资源
                最近更新 更多