2012-05-22 40 views
10

我想读取第一列中有条形码的csv文件,但是当R获取到data.frame中时,它会将“1665535004661”转换为“1.67E + 12”。有没有办法以整数格式保存这个数字?我试着分配一个“双”类,但那不起作用,也没有分配一个“字符”类。一旦它处于1.67E + 12格式,任何将其转换回整数的尝试都会返回“167000000000”。保留大数

感谢, J--

回答

12

这不是在 “1.67E + 12格式”,它只是将不会完全使用默认设置打印。 R正在读取它,并且整个数字都在那里。

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

看,数字一直存在。除非你有非常多的数字,否则他们不会迷路。根据您所带入的内容进行排序可以正常工作,您只需使用digits选项显式调用print()即可通过键入名称来隐式查看data.frame。

+0

这基本上覆盖我在下面讨论的方法用'选项()'。作为一个参考点,当'= print.default'中的实现开始成为特定于平台的问题时,应该阅读并注意'?print.default'中的警告,因为sprintf()的实现开始根据底层的C代码。 – Chase

+0

如果使用options(),情况也是如此。这只是一个输出默认值。我认为如果你在答案中明确了这一点,那将是最好的。因为这是相当模糊的。试图阅读它天真,我想知道如果数字选项只是改变了多少数字保留,他们是如何阅读?...什么? – John

+0

好点 - 编辑我的答案是更明确的。如果您认为有必要,随意调整。干杯! - 追逐 – Chase

3

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

+0

有没有办法,只是导入它作为一个人物?我不需要用它做数学,我只需要对它进行排序。 – James

+0

X < - “1665535004661” –

10

通过在评论中提到的内容,可以通过在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

从is.integer页:

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

1665535004661L> 2 * 10^9 [1] TRUE

你要打包Rmpfr。

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

由于您未对此值执行算术运算,因此字符是适当的。您可以使用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" 
1

当你正在做 read.csv您可以使用数字参数。例如:

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

这将保留长整数的值,并且在导入数据时不会混淆它们的表示形式。