2015-05-20 15 views
10

Ich benutze R um Census-Daten zu verarbeiten, die wirklich lange numerische GEOIDs verwenden, um die geografischen Regionen zu identifizieren. Das Problem, mit dem ich konfrontiert bin, ist beim Schreiben der verarbeiteten Daten mit write_csv (aus dem readr Paket) schreibt es diese GEOIDs in wissenschaftlicher Notation. Gibt es eine Möglichkeit, dies zu umgehen?readr: Schalte die wissenschaftliche Notation in write_csv aus

Hinweis: Ich kann die wissenschaftliche Notation auf der R-Konsole umschalten, indem Sie die Option scipen auf einen ausreichend großen Wert setzen. Diese Einstellung scheint sich jedoch nicht auf die Bibliothek readr auszudehnen.

ist hier ein Spielzeug-Datensatz:

library(dplyr) 
library(readr) # which is the package with write_csv 
(tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))) 
Source: local data frame [6 x 1] 

      GEOID 
1 60150001022000 
2 60150001022001 
3 60150001022002 
4 60150001022003 
5 60150001022004 
6 60150001022005 

write_csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv") 

Dies ist, was ich zur Zeit zu bekommen. Ich bin auf der Suche nach einer Möglichkeit, die gleichen Zahlen zu erhalten, wie oben:

GEOID 
6.02E+13 
6.02E+13 
6.02E+13 
6.02E+13 
6.02E+13 
6.02E+13 
+0

Können Sie ein kleines [reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) vorbereiten, um das Problem zu veranschaulichen? Sind Sie sicher, dass Sie diese als numerische Werte behandeln möchten? Vielleicht in Zeichen-/Faktorwerte umwandeln? – MrFlick

+0

Ich möchte weiterhin numerischen Typ verwenden. Es wäre gut zu wissen, wie man die wissenschaftliche Notation für Dateischreibvorgänge unterdrückt. – sriramn

Antwort

1

Ich würde Sie

write.csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv") 

statt

write_csv((tbl_df(data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)))), "test.csv") 

verwenden vorschlagen Wenn ich öffnen test.csv es öffnet die Datei in Excel. Excel verwandelt es in wissenschaftliche Notation. Wenn ich mit der rechten Maustaste klicke und mit dem Notizblock öffne, sieht es gut aus und ich sehe die ursprünglichen Zahlen ohne wissenschaftliche Notation.

+0

Danke! Ich versuche, in das 'readr'-Paket zu migrieren und schaue, wie ich es in dieser Bibliothek machen kann. – sriramn

3

Es wäre wahrscheinlich sicherer sein Zeichenwerte zu verwenden:

X <- tbl_df(data.frame(GEOID = as.character(seq(from=60150001022000, to=60150001022005)))) 

write_csv(X, "test.csv") 

Es ist ein bisschen ironisch, dass die write_csv Funktion einen Teil seiner Ausgabe Zeichenwerte tut zwingen, aber nicht numerische Spalten. Nur wenn eine Spalte den is.object Test besteht, wird sie erzwungen. Es scheint keinen Schalter zu geben, der die maximale Präzision bewahrt. Die write.table und ihre Nachkommen write.csv Funktionen haben mehrere Schalter, die Unterdrückung von Angeboten und anderen Einstellungen ermöglichen, die eine Anpassung der Ausgabe ermöglichen, aber write_csv hat sehr wenig von solchen.

Sie können write_csv dazu bringen, zu glauben, dass eine numerische Spalte etwas komplexer ist, und dies führt zu der Ausgabe as.character, wenn auch mit Anführungszeichen.

class(X[[1]])<- c("num", "numeric") 
vapply(X, is.object, logical(1)) 
#GEOID 
# TRUE 

write_csv(X, "") 
#[1] #"\"GEOID\"\n\"60150001022000\"\n\"60150001022001\"\n\"60150001022002\"\n\"60150001022003\"\n\"60150001022004\"\n\"60150001022005\"\n" 

Als Best Practices stimme ich Ihrer Entscheidung nicht zu, dass ID-Variablen numerisch bleiben. Es gibt zu viel Gewalt, die auf diesen Speichermodus für ein Objekt angewendet werden kann. Sie benötigen keine der arithmetischen Operationen für eine ID-Variable.

+0

Danke. Aber ich frage mich, ob es eine Möglichkeit gibt, das Verhalten für den numerischen Typ zu deaktivieren? – sriramn

1

Verwendung bit64, es ist eine S3-Klasse für Vektoren für die 64-Bit-Integer

library(dplyr) 
library(readr) 
options(digits = 22) 
tbl_df <- data.frame(GEOID = seq(from=60150001022000, to=60150001022005, 1)) 
> tbl_df 
      GEOID 
1 60150001022000 
2 60150001022001 
3 60150001022002 
4 60150001022003 
5 60150001022004 
6 60150001022005 

library(bit64) 
tbl_df$GEOID <- as.integer64(tbl_df$GEOID) 
write_csv(tbl_df,'test.csv') 

Wenn Sie diese Daten wieder in R lesen, wird es den richtigen Datentyp zuordnen.

dfr <- read_csv('test.csv') 
> dfr 
Source: local data frame [6 x 1] 

      GEOID 
1 60150001022000 
2 60150001022001 
3 60150001022002 
4 60150001022003 
5 60150001022004 
6 60150001022005 

> str(tbl_df) 
'data.frame': 6 obs. of 1 variable: 
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 6 obs. of 1 variable: 
$ GEOID: num 6.02e+13 6.02e+13 6.02e+13 6.02e+13 6.02e+13 ... 

Hoffe, das hilft. Ich habe den csv in einem Texteditor geöffnet, die Nummern hatten "" um sie herum. Aber es hat trotzdem funktioniert.

3

Ich würde eher empfehlen, solche Spalten zu typen int, denn wenn write_* wird keine wissenschaftliche Nummer Codierung mehr verwenden.Um alle numerischen Spalten in einem Durchgang zu umwandeln (beispielsweise im Fall sind Sie mit einer Matrix zählt zu tun), könnten Sie tun:

require(dplyr)  
tbl_df = mutate_if(tbl_df, is.numeric, as.integer) 
4

Ich schrieb ein pull request mit einem Patch, um die Kontrolle über die wissenschaftliche Notation in write_csv zu verbessern.

Mit diesem Patch hätten Sie ein int_use_scientific=FALSE Argument in write_csv, das Ihr Problem lösen würde. Hoffentlich wird es irgendwann zusammengeführt.

Verwandte Themen