我想使用R包sqldf的循环

时间:2015-12-08 23:59:25

标签: r sqldf

嗨我在R中有一个名为" Puestos"我想将数组中的所有值传递给sqldf查询,我试过这个:

    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)}

但我只收到此错误:

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

" OFFICE"是Puestos数组中第一个元素名称的一部分,这里是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")

1 个答案:

答案 0 :(得分:1)

代码的问题是:

  • for(i in Puestos)应为for(i in Puestos$PUESTO)

  • %s应为'%s',如评论中所述

  • sqldf(statement)应为print(sqldf(statement))

将它们放在一起,重新格式化并使用稍微更具描述性的索引,我们有以下内容:

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))
}

给出这个输出:

  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)