我想在 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)
嗨,我在 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)