2012-09-26 13 views
6

Questa domanda forse ha avuto risposta in precedenza, ma non ho visto una risposta.R: numero intero contro numerico

Ho un set di dati che consiste di numeri e valori mancanti. Una riga è una percentuale. Di seguito è riportato un piccolo insieme di dati falsi in cui AA, BB e CC sono i nomi delle colonne. La terza riga in questo set di dati è la percentuale.

AA BB CC 
    234 432 78 
1980 3452 2323 
91.1 90 93.3 
    34 123 45 

In questo caso, quando leggo il set di dati AA e CC sono numerici e BB è intero. Immagino che da qualche parte 90.0 sia stato arrotondato a 90. Se non specificassi che BB è numerico, ciò potrebbe causare problemi con l'aritmetica di base?

Credo che se dd = 1 ed ee = 2 ed entrambi sono interi allora il linguaggio C dice dd/ee = 0, mentre R dice dd/ee = 0.5.

Di seguito è riportata una serie di semplici operazioni matematiche che sembrano suggerire che le risposte in R non sono modificate indipendentemente dal fatto che i dati siano numerici o interi. Tuttavia, continuo a pensare che sarebbe intelligente specificare che tutte le variabili sono numeriche durante la lettura dei dati. Usando Google ho trovato un esempio o due in cui il tipo di dati sembra fare la differenza, ma non al di sotto.

aa <- c(1,2,3,4,5,6,7) 
bb <- 2 
str(aa) 
str(bb) 

cc <- as.integer(aa) 
dd <- as.integer(bb) 
str(cc) 
str(dd) 

aa/bb 
cc/dd 
aa/dd 
cc/bb 

ee <- aa * aa 
str(ee) 
sum(ee/2) 

ff <- cc * cc 
str(ff) 
sum(ff/2) 

gg <- 4.14 

hh <- ((aa * aa) * gg)/2 
hh 
ii <- ((cc * cc) * gg)/2 
ii 

jj <- (aa * aa)/gg 
jj 
kk <- (cc * cc)/gg 
kk 
jj == kk 

mm <- as.integer(1) 
nn <- as.integer(2) 
mm/nn 

immagino spero per rassicurazione che questo non è probabile un problema con la matematica semplice, ma ho il sospetto che può. Continuo a pensare che qui ci sia una regola fondamentale di programmazione, ma non sono sicuro di cosa sia. (Sono consapevole del concetto di doppia precisione.)

Grazie per qualsiasi consiglio con quello che è sicuramente un problema di base.

risposta

7

La divisione che utilizza l'operatore / restituirà sempre un "numerico", ovvero l'equivalente di un "doppio" C. I numeratori e i denominatori vengono prima convertiti in numerici e quindi la divisione viene eseguita. Se si desidera utilizzare la divisione intero è possibile utilizzare %/%. Se si desidera creare un numero intero, è possibile utilizzare trunc o floor oppure è possibile utilizzare round(x , 0) oppure è possibile utilizzare as.integer. Il primo secondo e il quarto di queste opzioni sono equivalenti. La funzione round restituirà ancora "numerico" anche se la rappresentazione stampata appare intero. Non penso che tu debba preoccuparti finché sarai soddisfatto dei risultati "doppio"/"numerico". Diamine, ci consentono anche la divisione per 0.

tuo 'aa' variabile è stato classificato come "numerico", pur essendo inserito come un gruppo di numeri interi, ma se aveste usato:

aa <- 1:8 # sequences are integer class. 

Sembra come se si vuole non essere troppo sorpreso da FAQ 7.31