tarifa subte sube sale precio ingresar hace estudiantil escalonada descuentos descuento cuanto buenos aires r integer double data.table median

sube - subte precio 2018



¿Por qué la mediana del viaje sube a los datos.tabla(entero versus doble)? (1)

TL; DR envuelve la median con as.double()

median() ''tropieza'' con data.table porque --- incluso cuando solo se pasaron vectores enteros --- median() veces devuelve un valor entero, y algunas veces devuelve un doble.

## median of 1:3 is 2, of type "integer" typeof(median(1:3)) # [1] "integer" ## median of 1:2 is 1.5, of type "double" typeof(median(1:2)) # [1] "double"

Reproduciendo su mensaje de error con un ejemplo mínimo:

library(data.table) dt <- data.table(patients = c(1:3, 1:2), weekdays = c("Mon", "Mon", "Mon", "Tue", "Tue")) dt[,median(patients), by=weekdays] # Error in `[.data.table`(dt, , median(patients), by = weekdays) : # columns of j don''t evaluate to consistent types for each group: # result for group 2 has column 1 type ''double'' but expecting type ''integer''

data.table se queja porque, después de inspeccionar el valor del primer grupo que se procesará, concluyó que, de acuerdo, estos resultados serán de tipo "entero". Pero de inmediato (o en su caso en el grupo 4), se pasa un valor de tipo "doble", que no encaja en su vector de resultados "entero".

data.table podría, en cambio, acumular resultados hasta el final de los cálculos grupales, y luego realizar conversiones de tipo si fuera necesario, pero eso requeriría un montón de gastos generales adicionales que degradan el rendimiento; en cambio, solo informa de lo que sucedió y le permite solucionar el problema. Después de que el primer grupo se haya ejecutado, y sepa el tipo de resultado, asigna un vector de resultado de ese tipo siempre que el número de grupos y luego lo rellena. Si luego descubre que algunos grupos devuelven más de 1 elemento, crecerá (es decir, reasignará) ese vector de resultado según sea necesario. Sin embargo, en la mayoría de los casos, la primera estimación de data.table para el tamaño final del resultado es la primera vez correcta (por ejemplo, resultado de 1 fila por grupo) y, por lo tanto, rápida.

En este caso, el uso de as.double(median(X)) lugar de la median(X) proporciona una solución adecuada.

(Por cierto, su versión que usa round() funcionó porque siempre devuelve valores de tipo "doble", como puede ver al escribir typeof(round(median(1:2))); typeof(round(median(1:3))) .)

Tengo una tabla de datos llamada enc.per.day para encuentros por día. Tiene 2403 filas en las que se especifica una fecha de servicio y el número de pacientes atendidos ese día. Quería ver la mediana del número de pacientes atendidos en cualquier tipo de día de la semana.

enc.per.day[,list(patient.encounters=median(n)),by=list(weekdays(DOS))]

Esa línea da un error.

Error en [.data.table (enc.per.day,, list (patient.encounters = mediana (n)),: las columnas de j no evalúan los tipos coherentes para cada grupo: el resultado para el grupo 4 tiene el tipo de columna 1 ''integer'' pero esperando el tipo ''double''

Lo siguiente todo funciona bien.

tapply(enc.per.day$n,weekdays(enc.per.day$DOS),median) enc.per.day[,list(patient.encounters=round(median(n))),by=list(weekdays(DOS))] enc.per.day[,list(patient.encounters=median(n)+0),by=list(weekdays(DOS))]

Que esta pasando? Me tomó mucho tiempo entender por qué mi código no funcionaría.

Por cierto, el vector subyacente enc.per.day $ n es un entero

storage.mode(enc.per.day$n)

devuelve "entero". Además, no hay NA en ninguna parte de la tabla de datos.