保留大量数字

时间:2012-05-22 23:55:19

标签: r csv import precision numeric

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

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

8 个答案:

答案 0 :(得分:14)

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

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

看,这些数字一直存在。除非你有很多数字,否则它们不会迷路。对你带来的内容进行排序将正常工作,你可以通过数字选项显式调用print()来查看你的data.frame,而不是通过输入名称隐式地调用。

答案 1 :(得分:11)

通过在colClasses中指定read.table(),您可以直接将文字作为字符导入。例如:

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

或者(以及其他用途),您可以在digits下指定options()变量。默认值为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下详细了解此信息。约翰在他的回答中描述了这一点,所以应该归功于他,因为它可以说明这种细微差别。

答案 2 :(得分:8)

尝试使用colClasses =“character”

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

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

看一下这个链接。

答案 3 :(得分:4)

来自?is.integer页面:

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

  

1665535004661L&gt; 2 * 10 ^ 9   [1] TRUE

你想要包Rmpfr。

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

答案 4 :(得分:3)

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

答案 5 :(得分:3)

您可以在使用时使用数字参数 read.csv。例如:

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

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

答案 6 :(得分:2)

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

data.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"

答案 7 :(得分:1)

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