2012-05-22 3 views
10

Sto provando a leggere un file csv che ha codici a barre nella prima colonna, ma quando R lo inserisce in un data.frame, converte "1665535004661" in "1,67E + 12". C'è un modo per preservare questo numero in un formato intero? Ho provato ad assegnare una classe di "doppio", ma non ha funzionato, né ho assegnato una classe di "carattere". Una volta nel formato 1.67E + 12, qualsiasi tentativo di riconvertirlo in un intero restituisce "167000000000".Conservazione di grandi numeri

Grazie, J--

risposta

12

Non è in un "+ 12 1.67E formato", semplicemente non stamperà interamente utilizzando le impostazioni predefinite. R la sta leggendo bene e l'intero numero è lì.

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

Sede, i numeri erano lì tutti insieme. Non si perdono se non si dispone di un numero molto elevato di cifre. L'ordinamento su ciò che hai inserito funzionerà correttamente e puoi chiamare esplicitamente print() con l'opzione cifre per vedere il tuo data.frame invece di digitare implicitamente il nome.

+0

Questo essenzialmente sovrascrive il metodo che discuto di seguito con 'options()'. Come punto di riferimento, si dovrebbe leggere e prestare attenzione all'avvertimento in '? Print.default' dato che l'implementazione a> = 16 cifre inizia a diventare un problema specifico della piattaforma poiché l'implementazione di' sprintf() 'inizia a differire in base al codice C sottostante. – Chase

+0

Lo stesso vale se si utilizzano le opzioni(). È solo un output predefinito. Penso che sarebbe meglio se tu fossi esplicito a riguardo nella tua risposta. È piuttosto vago. Cercando di leggerlo ingenuamente, mi chiedo se l'opzione relativa alle cifre cambia solo quante cifre vengono conservate, come vengono letti? ... cosa? – John

+0

Un buon punto: ho modificato la mia risposta per essere più esplicito al riguardo. Sentiti libero di modificare ulteriormente se ritieni necessario. Saluti! - Chase – Chase

3

dare un'occhiata al pacchetto int64: Bringing 64-bit data to R.

+0

C'è un modo per importarlo come un personaggio? Non ho bisogno di fare matematica, ho solo bisogno di sistemarci sopra. – James

+0

x <- "1665535004661" –

10

Riprendendo ciò che hai detto nei commenti, puoi importare direttamente il testo come carattere specificando lo colClasses in read.table(). Per esempio:

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 

In alternativa (e per altri usi), è possibile specificare la variabile digits sotto options(). Il valore predefinito è 7 cifre e l'intervallo accettabile è 1-22. Per essere chiari, l'impostazione di questa opzione non modifica o altera i dati sottostanti, ma semplicemente controlla come viene visualizzato sullo schermo una volta stampato. Dalla pagina di aiuto per ?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. 

Esempio che illustra questo:

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

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

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

per rimpolpare questo fuori completamente e per tenere conto per i casi in cui l'impostazione di un ambiente globale non è preferibile, è possibile specificare le cifre direttamente come argomento a print(foo, digits = bar). Puoi leggere ulteriori informazioni al riguardo sotto ?print.default. Questo è ciò che Giovanni descrive nella sua risposta, quindi il merito dovrebbe andare a lui per illuminare quella sfumatura.

4

Dalla pagina is.integer:?

"Si noti che le attuali implementazioni di R utilizzare interi a 32 bit per i vettori interi, in modo che la gamma di interi rappresentabili è limitato a circa +/- 2 * 10^9 ?

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

volete il pacchetto Rmpfr.

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

Poiché non si esegue l'aritmetica su questo valore, il carattere è appropriato. È possibile utilizzare l'argomento colClasses per impostare varie classi per ogni colonna, che è probabilmente migliore rispetto all'utilizzo di tutti i caratteri.

dati.csv:

a,b,c 
1001002003003004,2,3 

Leggi carattere, quindi interi:

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

È possibile utilizzare gli argomenti numerali quando si esegue read.csv. Così, per esempio:

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

Ciò preserva il valore delle lunghe interi e non pasticciare con la loro rappresentazione quando si importano i dati.