sqldf-Paket in R, das einen Datenrahmen abfragt

  • Ich versuche, etwas Code mit der sqldf-Bibliothek in R umzuschreiben, was mir erlauben sollte, SQL-Abfragen für Datenrahmen auszuführen, aber ich habe ein Problem, wenn ich versuche, ein Abfrage, R scheint, als würde er versuchen, die tatsächliche tatsächliche MySQL-Datenbankanforderung abzufragen, die ich verwende, und eine Tabelle anhand des Namens eines Datenrahmens suchen, nach dem ich zu suchen versuche.

    Wenn ich Folgendes ausführen:

         sqldf("SELECT COUNT(*) from work.class_scores")
     

    bekomme ich:

    Fehler in mysqlNewConnection (drv, ...): RS-DBI-Treiber: (Fehler beim Herstellen der Verbindung zur Datenbank: Fehler: Es kann keine Verbindung zum lokalen MySQL-Server hergestellt werden.) socket '/tmp/mysql.sock' (2) )

    Wenn ich versuche, den Speicherort auf zwei verschiedene Arten anzugeben (der erste bildet die googlecode-Seite, der zweite) was auf der Grundlage der Dokumente richtig sein sollte)

     >     sqldf("SELECT COUNT(*) from work.class_scores", sqldf.driver = "SQLite")
    Error in sqldf("SELECT COUNT(*) from work.class_scores", sqldf.driver = "SQLite") : 
      unused argument(s) (sqldf.driver = "SQLite")
    >     sqldf("SELECT COUNT(*) from work.class_scores", drv = "SQLite")
    Loading required package: tcltk
    Loading Tcl/Tk interface ... Error : .onLoad failed in loadNamespace() for 'tcltk', details:
      call: dyn.load(file, DLLpath = DLLpath, ...)
      error: unable to load shared library '/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so':
      dlopen(/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so, 10): Library not loaded: /usr/local/lib/libtcl8.5.dylib
      Referenced from: /Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so
      Reason: image not found
    Error: require(tcltk) is not TRUE
     

    Ich denke, es könnte ein Problem sein Dieses Paket tcltk, von dem ich noch nie gehört habe, versuche und kümmere mich darum und finde einige Probleme:

      > install.packages("tcltk")
    Warning in install.packages :
      argument 'lib' is missing: using '/Users/michaeldiscenza/Library/R/2.11/library'
    Warning in install.packages :
      package ‘tcltk’ is not available
    > install.packages("tcltk2", lib="/Applications/RStudio.app/Contents/Resources/R/library")
    trying URL 'http://lib.stat.cmu.edu/R/CRAN/bin/macosx/leopard/contrib/2.11/tcltk2_1.1-5.tgz'
    Content type 'application/x-gzip' length 940835 bytes (918 Kb)
    opened URL
    ==================================================
    downloaded 918 Kb
    
    
    The downloaded packages are in
        /var/folders/Y1/Y1gdz9tKFiSnWsGP9+BDcU+++TI/-Tmp-//RtmpL07KTL/downloaded_packages
    > library("tcltk")
    Loading Tcl/Tk interface ... Error : .onLoad failed in loadNamespace() for 'tcltk', details:
      call: dyn.load(file, DLLpath = DLLpath, ...)
      error: unable to load shared library '/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so':
      dlopen(/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so, 10): Library not loaded: /usr/local/lib/libtcl8.5.dylib
      Referenced from: /Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so
      Reason: image not found
    Error: package/namespace load failed for 'tcltk'
     

    Fehler in! dbPreExists: ungültiger Argumenttyp

    Hier weiß ich wirklich nicht, was das Problem ist. Muss ich etwas verschieben?

    Ein anderer Ansatz, den ich ausprobierte, bestand vor dem Ausführen der Abfrage für das Datenrahmenobjekt. Dabei wurde meine Datenbankverbindung so eingestellt, dass R dort nachschaute, anstatt zu versuchen, eine Verbindung zu den tatsächlichen lokalen MySQL-Daten herzustellen Base. Das hat aber nicht geklappt. Zurück zum Problem mit dem Socket (obwohl ich die lokale Datenbank ohne Probleme abfragen kann.)

     >     con <- sqldf()
    Error in mysqlNewConnection(drv, ...) : 
      RS-DBI driver: (Failed to connect to database: Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
    )
     

    Schließlich möchte ich abfragen, um die Anzahl der Datensätze zu ermitteln, bei denen der Wert für C beispielsweise größer als 2 ist, und ich fühle mich wohl dabei, das zu tun. Das einzige Problem ist, dass ich nicht weiß, ob es eine andere Möglichkeit gibt, das, was ich angibt Abfragen ist ein Datenrahmen und keine eigentliche Datenbank. Fehlt mir hier etwas wirklich Dummes und Leichtes?

    Danke!

    23 November 2011
    djq
2 answers
  • Diese Antwort wurde aus meinen früheren Kommentaren übertragen.

    Der Beitrag und die Kommentare zeigen Folgendes an:

    1. Es ist erwünscht, SQLite mit sqldf zu verwenden, auch wenn RMySQL geladen ist, und

    2. . Es wurde eine Meldung angezeigt, dass tcltk fehlt

    3. Es gab ein Problem hinsichtlich: sqldf("select count(*) from work.class_scores") wobei work.class_scores ein Datenrahmen ist.

    4. < / ol>

      Auf den Adressen sqldf-Startseite FAQ # 7-Adressen (1) und FAQ # 5-Adressen (2). (3) beruht auf der Tatsache, dass dot ein SQL-Operator ist, daher müssen diese Datenrahmennamen in Anführungszeichen gesetzt werden, oder ihr Name muss geändert werden, um den Punkt zu entfernen.

      Nachfolgend stellen wir reproduzierbare Daten bereit Beispiel, das die obigen drei Lösungen implementiert.

      Mit der Option sqldf.driver wird die Verwendung von SQLite erzwungen, auch wenn RMySQL geladen ist.

      In Bezug auf tcltk gibt es drei Ansätze: (i) Die Option gsubfn.engine bewirkt, dass der R-Code anstelle von tcltk verwendet wird, so dass das tcltk-Paket nicht benötigt wird. Siehe Beispielcode unten. (ii) Installieren Sie alternativ tcltk. (iii) Diese Frage wurde gestellt, als sqldf 0.4-4 die aktuelle Version war, aber jetzt, da sqldf 0.4-5 nicht mehr verfügbar ist, wurde die zusätzliche Erkennung von tcltk-Paketen hinzugefügt. Dies macht es wahrscheinlicher, dass sie dies automatisch erledigt, ohne dass der Benutzer dies getan hat um alle Optionen einzustellen und ohne tcltk installieren zu müssen. Daher ist die einfachste Lösung die Aktualisierung auf sqldf 0.4-5 oder höher.

      Wir zitieren den Datenrahmennamen mit einem Punkt oder ersetzen den Datenrahmennamen durch einen Namen enthält keinen Punkt:

       options(sqldf.driver = "SQLite") # as per FAQ #7 force SQLite
      options(gsubfn.engine = "R") # as per FAQ #5 use R code rather than tcltk
      
      library(RMySQL)
      library(sqldf)
      
      work.class_scores <- BOD # BOD is built in
      sqldf("select count(*) from 'work.class_scores'")
      
      # or
      work_class_scores <- work.class_scores
      sqldf("select count(*) from work_class_scores")
       

      BEARBEITEN:

      hinzugefügt Info über sqldf 0.4-5.

    22 November 2011
    G. Grothendieck
  • Versuchen Sie, das Paket tcl von hier ? (setzt voraus, dass Sie sich auf einem Mac befinden).

    22 November 2011
    djq