Angel
Angel

Reputation: 23

I want to use a loop with the R package sqldf

Hi I have an array in R called "Puestos" and I want to pass all the values in the array into a sqldf query, I tried this:

    library(sqldf)
    for (i in Puestos){
    statement = sprintf("select mes, puesto, sum(numero) as numero,sum(faltas) as faltas
    from M_C where puesto=%s group by mes, puesto",i)
    sqldf(statement)}

but I only get this error:

   Error in sqliteSendQuery(con, statement, bind.data) : 
   error in statement: near "OFFICE": syntax error

"OFFICE" is a part of the name of the first element in the Puestos array, here is the head of Puestos:

head(Puestos)
     PUESTO
BACK OFFICE DE REPORTERIA C
OPERADOR A
OPERADOR B
TELEOPERADOR(A) ATENCION A CLIENTES
TELEVENDEDOR(A)
BACK OFFICE DE CALIDAD A

head(M_C)
MES GENERO         ESCOLARIDAD         ESTATUS_ESCOLARIDAD                   PUESTO            NUMERO FALTAS
4      F   BACHILLERATO/PREPARATORIA         CONCLUIDO           BACK OFFICE DE REPORTERIA C      1      0
4      F   BACHILLERATO/PREPARATORIA         CONCLUIDO                            OPERADOR A      1      1
4      F   BACHILLERATO/PREPARATORIA         CONCLUIDO                            OPERADOR B     12      9
4      F   BACHILLERATO/PREPARATORIA         CONCLUIDO   TELEOPERADOR(A) ATENCION A CLIENTES     11      3
4      F   BACHILLERATO/PREPARATORIA         CONCLUIDO                       TELEVENDEDOR(A)     51     38
4      F   BACHILLERATO/PREPARATORIA         EN CURSO                            OPERADOR B       1      0


dput(head(Puestos))
structure(list(PUESTO = structure(c(12L, 20L, 21L, 23L, 25L, 
4L), .Label = c("Agente de Calidad", "AGENTE DE CALIDAD", "Back Office de Calidad A", 
"BACK OFFICE DE CALIDAD A", "Back Office de Calidad B", "BACK OFFICE DE CALIDAD B", 
"BACK OFFICE DE MOTIVACION C", "Back Office de Operaciones", 
"BACK OFFICE DE OPERACIONES", "BACK OFFICE DE REPORTERIA B", 
"Back Office de Reporteria C", "BACK OFFICE DE REPORTERIA C", 
"Back Office de Reporteria D", "BACK OFFICE DE REPORTERIA D", 
"BACK OFFICE DE VALIDADOR B", "BACK OFFICE DE VALIDADOR C", "BO-MOTIBBACK", 
"Formador Operativo", "FORMADOR OPERATIVO", "OPERADOR A", "OPERADOR B", 
"TECNICO", "TELEOPERADOR(A) ATENCION A CLIENTES", "TELEOPERADOR(A) TECNICO", 
"TELEVENDEDOR(A)"), class = "factor")), .Names = "PUESTO", row.names = c(NA, 
6L), class = "data.frame")


dput(head(M_C))
structure(list(MES = c(4L, 4L, 4L, 4L, 4L, 4L), GENERO = structure(c(1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("F", "M"), class = "factor"), 
ESCOLARIDAD = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("BACHILLERATO/PREPARATORIA", 
"LICENCIATURA/INGENIERIA", "POSGRADO", "SECUNDARIA", "TECNICO"
), class = "factor"), ESTATUS_ESCOLARIDAD = structure(c(1L, 
1L, 1L, 1L, 1L, 2L), .Label = c("CONCLUIDO", "EN CURSO", 
"PASANTE", "TRUNCO"), class = "factor"), PUESTO = structure(c(12L, 
20L, 21L, 23L, 25L, 21L), .Label = c("Agente de Calidad", 
"AGENTE DE CALIDAD", "Back Office de Calidad A", "BACK OFFICE DE CALIDAD A", 
"Back Office de Calidad B", "BACK OFFICE DE CALIDAD B", "BACK OFFICE DE MOTIVACION C", 
"Back Office de Operaciones", "BACK OFFICE DE OPERACIONES", 
"BACK OFFICE DE REPORTERIA B", "Back Office de Reporteria C", 
"BACK OFFICE DE REPORTERIA C", "Back Office de Reporteria D", 
"BACK OFFICE DE REPORTERIA D", "BACK OFFICE DE VALIDADOR B", 
"BACK OFFICE DE VALIDADOR C", "BO-MOTIBBACK", "Formador Operativo", 
"FORMADOR OPERATIVO", "OPERADOR A", "OPERADOR B", "TECNICO", 
"TELEOPERADOR(A) ATENCION A CLIENTES", "TELEOPERADOR(A) TECNICO", 
"TELEVENDEDOR(A)"), class = "factor"), NUMERO = c(1L, 1L, 
12L, 11L, 51L, 1L), FALTAS = c(0L, 1L, 9L, 3L, 38L, 0L)), .Names = c("MES", 
"GENERO", "ESCOLARIDAD", "ESTATUS_ESCOLARIDAD", "PUESTO", "NUMERO", 
"FALTAS"), row.names = c(NA, 6L), class = "data.frame")

Upvotes: 0

Views: 304

Answers (1)

G. Grothendieck
G. Grothendieck

Reputation: 269491

The problems with code are:

  • for(i in Puestos) should be for(i in Puestos$PUESTO)

  • %s should be '%s' as mentioned in the comments

  • sqldf(statement) should be print(sqldf(statement))

Putting it together, reformatting and using a slightly more descriptive index we have the following:

library(sqldf)

for (p in Puestos$PUESTO) {
    statement = sprintf("select mes, puesto, sum(numero) as numero, sum(faltas) as faltas
                         from M_C 
                         where puesto = '%s' 
                         group by mes, puesto", p)
    print(sqldf(statement))
}

giving this output:

  MES                      PUESTO numero faltas
1   4 BACK OFFICE DE REPORTERIA C      1      0
  MES     PUESTO numero faltas
1   4 OPERADOR A      1      1
  MES     PUESTO numero faltas
1   4 OPERADOR B     13      9
  MES                              PUESTO numero faltas
1   4 TELEOPERADOR(A) ATENCION A CLIENTES     11      3
  MES          PUESTO numero faltas
1   4 TELEVENDEDOR(A)     51     38
[1] MES    PUESTO numero faltas
<0 rows> (or 0-length row.names)

Upvotes: 1

Related Questions