2015-12-08 33 views
-1

嗨循環我有R中被稱爲「Puestos」一個數組,我想在陣列中的所有值傳遞到sqldf查詢,我嘗試這樣做:我想使用的R包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 

「辦公室」是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

我假設你需要在引號來包裝你的字符串值。就像:'puesto ='%s'' – MrFlick

+0

是的,我試過了,但它不起作用。 – Angel

+0

好吧,我會這樣做的。對不起,這是我的第一篇文章。 – Angel

回答

1

與代碼的問題是:

  • for(i in Puestos)應該for(i in Puestos$PUESTO)

  • %s'%s'在評論中提到

  • sqldf(statement)應該print(sqldf(statement))

把它至GETHER,重新格式化和使用更具描述性指標,我們有以下幾點:

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) 
+0

它完美,謝謝。 – Angel