2012-05-22 19 views
10

Ich versuche, eine CSV-Datei zu lesen, die Barcodes in der ersten Spalte hat, aber wenn R es in ein dat.frame bekommt, wandelt es "1665535004661" in "1.67E + 12" um. Gibt es eine Möglichkeit, diese Zahl in einem Integer-Format zu erhalten? Ich habe versucht, eine Klasse von "Doppel" zuzuweisen, aber das hat nicht funktioniert, noch eine Klasse von "Charakter" zugeordnet. Sobald es im 1.67E + 12-Format ist, gibt jeder Versuch, es zurück in eine Ganzzahl zu konvertieren, "167000000000" zurück.Große Zahlen behalten

Danke, J--

Antwort

12

Es ist nicht in einem "1.67E + 12-Format", es druckt nur nicht ganz die Vorgaben verwenden. R liest es gut und die ganze Zahl ist da.

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

Siehe, die Zahlen waren dort die ganze Zeit. Sie gehen nicht verloren, wenn Sie nicht wirklich viele Ziffern haben. Sortieren nach dem, was Sie hereingebracht haben, funktioniert gut und Sie können nur explizit print() mit der Option Ziffern aufrufen, um Ihr data.frame implizit zu sehen, indem Sie den Namen eingeben.

+0

Dies überschreibt im Wesentlichen die Methode, die ich unten mit 'options()' diskutiere. Als Bezugspunkt sollte man die Warnung in '? Print.default' lesen und beachten, da die Implementierung bei> = 16 Stellen anfängt, ein plattformspezifisches Problem zu werden, da die Implementierung von' sprintf() 'auf der Basis von zugrunde liegenden C-Code. – Chase

+0

Das gleiche gilt, wenn Sie options() verwenden. Es ist nur ein Ausgangsstandard. Ich denke, es wäre das Beste, wenn Sie in Ihrer Antwort ausdrücklich darauf eingehen würden. Wie es ist, das ist ziemlich vage. Ich versuche, es naiv zu lesen. Ich frage mich, ob die Ziffern-Option nur ändert, wie viele Ziffern erhalten bleiben, wie sie eingelesen werden? ... was? – John

+0

Guter Punkt - redigierte meine Antwort, um mehr darüber zu erklären. Fühlen Sie sich frei, weiter zu optimieren, wenn Sie es für notwendig halten. Prost! - Verfolgungsjagd – Chase

3

einen Blick auf das Paket int64 Nehmen: Bringing 64-bit data to R.

+0

Gibt es eine Möglichkeit, es nur als ein Zeichen zu importieren? Ich muss das nicht mit Mathe machen, ich muss nur danach sortieren. – James

+0

x <- "1665535004661" –

10

Sie können den Text direkt als Zeichen importieren, indem Sie die colClasses in read.table() eingeben. Zum Beispiel:

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 

Alternativ (und für andere Zwecke), können Sie die digits Variable unter options() angeben. Der Standardwert ist 7 Ziffern und der akzeptable Bereich ist 1-22. Um es klar zu sagen: Wenn Sie diese Option nicht ändern oder ändern, wird lediglich gesteuert, wie sie beim Drucken auf dem Bildschirm angezeigt wird. Von der Hilfeseite für ?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. 

Beispiel dies illustriert:

options(digits = 7) 
dat<- read.table(text = num) 

dat 
#------ 
      V1 
1 1.665535e+12 

options(digits = 22) 
dat 
#------ 
      V1 
1 1665535004661 

diese vollständig zu konkretisieren und für die Fälle zu berücksichtigen, wenn eine globale Einstellung Einstellung nicht bevorzugt ist, können Sie Ziffern angeben direkt als ein Argument zu print(foo, digits = bar). Sie können mehr darüber unter ?print.default lesen. Das ist es, was Johannes in seiner Antwort beschreibt, so dass ihm Ehre zuteil werden sollte, um diese Nuance zu beleuchten.

4

Von is.integer-Seite:

„, dass aktuelle Implementierungen von R Hinweis verwenden 32-Bit-Integer für ganzzahlige Vektoren, so ist der Bereich der darstellbaren ganzen Zahlen auf etwa +/- 2 * 10^9 eingeschränkt

?

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

Sie verpacken Rmpfr wollen.

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

Da Sie für diesen Wert keine Arithmetik ausführen, ist das Zeichen geeignet. Sie können das colClasses-Argument verwenden, um für jede Spalte verschiedene Klassen festzulegen, was wahrscheinlich besser ist als die Verwendung aller Zeichen.

Daten.csv:

a,b,c 
1001002003003004,2,3 

lesen Charakter, dann ganze Zahlen:

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

Sie können die Zahlen Argumente verwenden, wenn Sie read.csv tun. So zum Beispiel:

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

Dieser auf den Wert der langen ganzen Zahlen bewahrt und verwirrt nicht mit ihrer Darstellung wenn Sie die Daten importieren.

Verwandte Themen