嗨我在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")
答案 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)