2015-08-17

Campo calculado entero en lugar de numérico usando sqldf en R

Title

Problema

Al usar sqldf, al contrario que R, cuando dividimos un número entero entre otro, devuelve un número entero en lugar de uno real. Es decir:

  • R
  • 1/5
    
    [1] 0.2
    
  • sqldf
  • library(sqldf)
    sqldf("SELECT 1/5")
    
      1/5
    1   0
    

    Solución

    Multiplicamos el numerador o el denominador por 1.0 o convertimos uno de los números a real.

    sqldf("SELECT (1.0*1)/5") # Numerador
    sqldf("SELECT 1/(5*1.0)") # Denominador
    sqldf("SELECT CAST(1 AS REAL)/5") # Convertimos numerador
    sqldf("SELECT 1/CAST(5 AS REAL)") # Convertimos denominador
    

    Otro ejemplo

    Veamos un ejemplo práctico que vimos en esta entrada. Calcularemos el porcentaje del total de la columna del siguiente data frame.

        x freq
    1 Jan    7
    2 Feb   23
    3 Mar   86
    4 Apr  281
    
    Código para crear el data frame anterior:

    df <- read.table(text = "x    freq
                            Jan   7
                            Feb   23
                            Mar   86
                            Apr   281", 
                            header =TRUE)
    
  • Solución
  • sqldf('SELECT x, freq, (freq*1.0)/(SELECT SUM(freq) 
          FROM df) AS prob
          FROM df')
    
        x freq       prob
    1 Jan    7 0.01763224
    2 Feb   23 0.05793451
    3 Mar   86 0.21662469
    4 Apr  281 0.70780856
    

    Entradas relacionadas

    No hay comentarios:

    Publicar un comentario

    Nube de datos