14

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

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

4

8 回答 8

18

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

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

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

于 2012-05-23T03:17:00.810 回答
15

根据您在评论中所说的内容,您可以通过指定colClassesin直接将文本导入为字符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

或者(以及其他用途),您可以digitsoptions(). 默认值为 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。这就是约翰在他的回答中所描述的,因此应该归功于他阐明了这种细微差别。

于 2012-05-23T00:39:31.773 回答
10

尝试使用 colClasses="character"

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

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

看看这个链接。

于 2012-05-23T00:31:59.063 回答
6

从 ?is.integer 页面:

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

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

你想要包 Rmpfr。

library(Rmpfr)
x <- mpfr(15, precBits= 1024)
于 2012-05-23T02:06:04.353 回答
4

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

于 2012-05-23T00:03:27.580 回答
4

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

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

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

于 2016-07-04T11:02:39.953 回答
3

由于您没有对该值执行算术运算,因此字符是合适的。您可以使用 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"
于 2012-05-23T02:42:04.947 回答
0

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

于 2019-12-05T14:41:26.750 回答