Reputation: 23
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
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