2012-09-26 10 views
6

Esta pregunta tal vez ha sido respondida anteriormente, pero no he visto una respuesta.R: entero versus numérico

Tengo un conjunto de datos que consta de números y valores faltantes. Una fila es un porcentaje. A continuación se muestra un pequeño conjunto de datos falsos donde AA, BB y CC son los nombres de las columnas. La tercera fila en este conjunto de datos es el porcentaje.

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

En este caso, cuando leo el conjunto de datos AA y CC son numéricos y BB es un número entero. Supongo que en algún lugar 90.0 se redondeó a 90. Si no especifico que BB es numérico, ¿podría esto causar problemas con la aritmética básica?

Creo que si dd = 1 y ee = 2 y ambos son enteros, entonces el lenguaje C dice dd/ee = 0, mientras que R dice dd/ee = 0.5.

A continuación se muestra una serie de operaciones matemáticas simples que todas parecen indicar que las respuestas en R no se modifican independientemente de si los datos son numéricos o enteros. Sin embargo, sigo pensando que sería inteligente especificar que todas las variables sean numéricas al leer los datos. Utilizando Google, he encontrado uno o dos ejemplos en los que el tipo de datos parecía marcar la diferencia, pero no a continuación.

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 

Supongo que espero que esto no sea un problema con las matemáticas simples, pero sospecho que sí. Sigo pensando que aquí hay una regla fundamental de programación, pero no estoy seguro de qué es eso. (Soy consciente del concepto de doble precisión.)

Gracias por cualquier consejo con lo que sin duda es un problema básico.

Respuesta

7

La división que utiliza el operador / siempre devolverá un "valor numérico", es decir, el equivalente de un "doble" C. Los numeradores y los denominadores son coaccionados primero a numéricos y luego la división está lista. Si desea usar la división de enteros, puede usar %/%. Si desea crear un número entero, puede usar trunc o floor o puede usar round(x , 0) o puede usar as.integer. El primer segundo y cuarto de esas opciones son equivalentes. La función redonda aún devolverá "numérico" aunque la representación impresa aparezca entera. No creo que deba preocuparse, siempre y cuando esté satisfecho con los resultados "dobles"/"numéricos". Heck, que incluso permiten la división por 0.

Su 'aa' variable se clasifica como "numérico" a pesar de ser introducido como un grupo de números enteros pero que habíamos utilizado:

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

Suena como si se quiere no se sorprenda demasiado por FAQ 7.31

Cuestiones relacionadas