2013-02-12 129 views
1

我最近做了我的舉動來使用sqldf包,所以可能是我錯過了這裏的觀點。
我想做一個「選擇案例」,而不是嵌套ifelse()。我第一次做了一個,它的工作原理。sqldf - sqliteExec語句:聲明中的錯誤:沒有這樣的表

cohort$activite = 
sqldf("select case activite when 1 then 'actif a plein temps' 
          when 2 then 'actif a temps partiel' 
          when 3 then 'actif en milieu' 
          ELSE 'Données manquantes' END 
     from cohort") 

然後在我的腳本只是運行後一個又一個,我已經收到了這個錯誤:

cohort$motifs_ini= 
sqldf("select case motifs_ini when 1 then 'contre indication medicale' 
           when 2 then 'refus du patient' 
           when 4 then 'bilan en cours' 
           when 3 then 'autre motif' 
           when 99 then 'Non precise' 
           ELSE 'Données Manquantes' END 
     from cohort") 

Erreur dans sqliteExecStatement(con, statement, bind.data) : 
RS-DBI driver: (error in statement: no such table: cohort) 
De plus : Message d'avis : 
In value[[3L]](cond) : 
RAW() can only be applied to a 'raw', not a 'character' 

我不明白爲什麼我有這個錯誤。數據框存在,我已經用相同類型的命令修改了一個可變參數。是因爲我試圖攻擊相同的data.frame?
任何幫助將是appriciate。

編輯:這是我的9213行數據框的6個第一行。

structure(list(dure_ttt = c(1402L, 556L, 778L, 30L, 123L, 241L 
), sexe = c(1L, 2L, 1L, 1L, 2L, 1L), nephro_ini1 = structure(c(68L, 
68L, 68L, 68L, 68L, 68L), .Label = c("0108NL", "0401NL", "0404NL", 
"0405NL", "0406NL", "0407NL", "0408NL", "0409NL", "0410NL", "0411NL", 
"0412NL", "0413NL", "0415NL", "0416NL", "0417NL", "0418NL", "0419NL", 
"0420NL", "0421NL", "0422NL", "0423NL", "0424NL", "0425NL", "0441NL", 
"0442NL", "0443NL", "0446NL", "0447NL", "0448NL", "0449NL", "0450NL", 
"0455NL", "0456NL", "0457NL", "0458NL", "0502NL", "0521NL", "0522NL", 
"0523NL", "0524NL", "0525NL", "0526NL", "0527NL", "0528NL", "0529NL", 
"0530NL", "0531NL", "0532NL", "0533NL", "0534NL", "0535NL", "0536NL", 
"0537NL", "0601NL", "0602NL", "0603NL", "0604NL", "0605NL", "0606NL", 
"0607NL", "0608NL", "0701NL", "0702NL", "0703NL", "0801NL", "0802NL", 
"0804NL", "0NL", "1107NL", "1108NL", "1141NL", "1145NL", "1308NL", 
"1337NL", "1352NL", "1414NL", "1415NL", "1416NL", "1417NL", "1435NL", 
"1501NL", "1502NL", "1503NL", "1505NL", "1506NL", "1507NL", "1521NL", 
"1522NL", "1523NL", "1531NL", "1535NL", "1536NL", "1540NL", "1542NL", 
"1551NL", "1552NL", "1554NL", "1558NL", "1749NL", "1801NL", "1804NL", 
"1805NL", "1806NL", "1812NL", "1813NL", "1814NL", "1817NL", "1823NL", 
"2213NL", "2215NL", "2216NL", "2307NL", "2311NL", "2314NL", "2318NL", 
"3202NL"), class = "factor"), catheter = c(1L, 1L, 1L, 0L, 1L, 
0L), urgence = c(0L, 0L, 1L, 0L, 0L, 0L), activite = c(8L, 4L, 
4L, 10L, 10L, 0L), nb_comorbidite_ini = c(2L, 6L, 6L, 3L, 2L, 
1L), presence_comorbidite_ini = c(1L, 1L, 1L, 1L, 1L, 1L), nb_acv_ini = c(1L, 
1L, 3L, 3L, 0L, 0L), presence_acv_ini = c(1L, 1L, 1L, 1L, 0L, 
0L), diabete_ini = c(0L, 0L, 0L, 0L, 0L, 0L), type_diabete_ini = c(99L, 
99L, 99L, 99L, 99L, 99L), insuline_ini = c(0L, 0L, 0L, 0L, 0L, 
0L), hta_ini = c(1L, 1L, 1L, 0L, 0L, 1L), hypercholesterolemie_ini = c(0L, 
1L, 0L, 0L, 1L, 0L), fumeur_ini = c(0L, 1L, 1L, 0L, 0L, 0L), 
    ex_fumeur_ini = c(0L, 0L, 0L, 0L, 0L, 0L), insuff_respiratoire_ini = c(0L, 
    1L, 0L, 0L, 0L, 0L), oxygenotherapie_ini = c(0L, 0L, 0L, 
    0L, 0L, 0L), insuffisance_cardiaque_ini = c(0L, 0L, 1L, 1L, 
    0L, 0L), stade_IC_ini = c(99L, 99L, 1L, 3L, 99L, 99L), infarctus_ini = c(0L, 
    0L, 1L, 1L, 0L, 0L), angor_ini = c(0L, 0L, 0L, 0L, 0L, 0L 
    ), arythmie_ini = c(1L, 0L, 0L, 1L, 0L, 0L), arterite_MI_ini = c(0L, 
    1L, 1L, 0L, 0L, 0L), stade_arterite_MI_ini = c(99L, 1L, 3L, 
    99L, 99L, 99L), avc_ini = c(0L, 0L, 0L, 0L, 0L, 0L), ait_ini = c(0L, 
    0L, 0L, 0L, 0L, 0L), cancer_ini = c(0L, 0L, 0L, 0L, 1L, 0L 
    ), cirrhose_ini = c(0L, 0L, 0L, 0L, 0L, 0L), cirrhose_A_ini = c(0L, 
    0L, 0L, 0L, 0L, 0L), cirrhose_BC_ini = c(0L, 0L, 0L, 0L, 
    0L, 0L), hepatite_ini = c(0L, 0L, 0L, 0L, 0L, 0L), hepatite_B_ini = c(0L, 
    0L, 0L, 0L, 0L, 0L), hepatite_C_ini = c(0L, 0L, 0L, 0L, 0L, 
    0L), VIH_ini = c(0L, 0L, 0L, 0L, 0L, 0L), sida_ini = c(0L, 
    0L, 0L, 0L, 0L, 0L), transpl_ini = c(0L, 0L, 0L, 0L, 0L, 
    0L), nb_handicap_ini = c(0L, 1L, 1L, 0L, 0L, 0L), amputat_ini = c(0L, 
    0L, 0L, 0L, 0L, 0L), hemipl_ini = c(0L, 0L, 0L, 0L, 0L, 0L 
    ), cecite_ini = c(0L, 0L, 0L, 0L, 0L, 0L), compor_ini = c(0L, 
    1L, 1L, 0L, 0L, 0L), inscri_ini = c(0L, 0L, 0L, 0L, 0L, 0L 
    ), motifs_ini = c(1L, 1L, 1L, 1L, 3L, 99L), hospit_ini = c(0L, 
    1L, 0L, 1L, 1L, 0L), nbr_hospit_ini = c(0, 2, 0, 1, 1, 0), 
    duree_hospit_ini = c(99L, 2L, 99L, 2L, 2L, 99L), marche_ini = c(3L, 
    3L, 99L, 1L, 3L, 99L), structure_ini = c(1L, 1L, 1L, 1L, 
    1L, 1L), methode_ini = c(1L, 1L, 1L, 1L, 1L, 1L), voie_abord_ini = c(1L, 
    3L, NA, 4L, 3L, 1L), nb_seances_ini = c(3L, 3L, NA, 3L, 3L, 
    3L), erythropoietine_ini = c(0L, 1L, 0L, 0L, 0L, 0L)), .Names = c("dure_ttt", 
"sexe", "nephro_ini1", "catheter", "urgence", "activite", "nb_comorbidite_ini", 
"presence_comorbidite_ini", "nb_acv_ini", "presence_acv_ini", 
"diabete_ini", "type_diabete_ini", "insuline_ini", "hta_ini", 
"hypercholesterolemie_ini", "fumeur_ini", "ex_fumeur_ini", "insuff_respiratoire_ini", 
"oxygenotherapie_ini", "insuffisance_cardiaque_ini", "stade_IC_ini", 
"infarctus_ini", "angor_ini", "arythmie_ini", "arterite_MI_ini", 
"stade_arterite_MI_ini", "avc_ini", "ait_ini", "cancer_ini", 
"cirrhose_ini", "cirrhose_A_ini", "cirrhose_BC_ini", "hepatite_ini", 
"hepatite_B_ini", "hepatite_C_ini", "VIH_ini", "sida_ini", "transpl_ini", 
"nb_handicap_ini", "amputat_ini", "hemipl_ini", "cecite_ini", 
"compor_ini", "inscri_ini", "motifs_ini", "hospit_ini", "nbr_hospit_ini", 
"duree_hospit_ini", "marche_ini", "structure_ini", "methode_ini", 
"voie_abord_ini", "nb_seances_ini", "erythropoietine_ini"), row.names = c(NA, 
6L), class = "data.frame") 
+2

使用'dput'發佈足夠的數據以重現問題。 – 2013-02-12 13:26:18

回答

4

嗯,因爲它返回一個數據幀分配第一查詢的結果到您的原始數據幀被破壞其結構的一列,而不是讓其他查詢我從來沒有用過sqldf但只要。我試着不分配整個結果,但只有第一列和它的工作:

df2$activite<- sqldf("SELECT CASE activite 
         WHEN 1 TEHN 'actif a plein temps' 
         WHEN 2 TEHN 'actif a temps partiel' 
         WHEN 3 TEHN 'actif en milieu' 
         ELSE 'Données manquantes' END 
         from df2")[[1]] 

(其中DF2是您的隊列),然後其他查詢工作。也許有更經典的方式來獲得你所需要的...

+0

@vodka謝謝。它似乎工作,但我仍然有一個警告:'在價值[[3L]](cond):RS-DBI驅動程序:(聲明中的錯誤:表'df2'已存在)... ...神祕仍然存在,但只要它工作... – 2013-02-12 14:39:54

+0

@AmanGast這很奇怪我沒有看到這個警告。 – vodka 2013-02-12 14:58:54

+0

@Aman Gast,請把這個新的問題以可重現的形式。如果'cohort'是帖子中的'dput'輸出,那麼在糾正THEN的拼寫後,答案中的代碼即'df2 < - cohort; df2 $ activite < - sqldf(「SELECT CASE activite when then THEN'actif a plein temps'when 2 THEN'actif temps partiel'when 3 THEN'actif en milieu'ELSE'Donnéesmanquantes'END from df2」)[[1 ]]' '對我來說沒有錯誤或警告。 – 2013-02-12 15:52:54

3

@vodka答案是很好的答案。 sqldf返回一個data.frame。因此,直接分配它將更正您的初始數據。框架(成爲列表的列表)。

這裏只是一種方法來返回一個更漂亮的結果。您可以使用AS來分配新列名稱,然後使用它來分配舊列。

cohort <- data.frame(motifs_ini=c(1,2,3,4,99,100)) 
cohort$motifs_ini <- sqldf("SELECT CASE motifs_ini 
           WHEN 1 THEN 'contre indication medicale' 
           WHEN 2 THEN 'refus du patient' 
           WHEN 4 THEN 'bilan en cours' 
           WHEN 3 THEN 'autre motif' 
           WHEN 99 THEN 'Non precise' 
           ELSE 'Données Manquantes' 
          END AS newcol 
          FROM cohort")$newcol 


cohort 
        motifs_ini 
1 contre indication medicale 
2   refus du patient 
3    autre motif 
4    bilan en cours 
5    Non precise 
6   Données Manquantes