我想在 R 包 sqldf 中使用循环

I want to use a loop with the R package 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")

代码的问题是:

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