2017-06-22 4 views
0

Sehr schwierig, hier ein funktionierendes Beispiel zu liefern, also versuche ich, das Problem zu erklären.R RODBC sqlSave - Übereinstimmung nach Spaltennamen

Ich habe eine Tabelle in einer Datenbank tableDb mit Spalten A, B, C.

Ich habe einen Datenrahmen in einem R df mit Spalten A, C, B.

Jetzt bin ich mit

sqlSave(channelToDb, dat = df, tablename = "tableDb", append = TRUE, 
rownames = FALSE, fast = FALSE) 

die Daten von df in tableDb zu speichern.

Das Problem ist, dass die Daten aus der Spalte von Bdf in Spalte C von tableDb gespeichert sind, und von Cdf wird in Spalte B gespeichert.

So sqlSave stimmt nicht die beiden Tabellen nach Spaltenname, sondern nur nach Index?

Gibt es eine Möglichkeit, nach Spaltennamen zu suchen?

Antwort

0

Die einfachste war, dies zu tun ist Ihren Datenrahmen neu zu ordnen vor dem Speichern:

df<-df[c("A", "C", "B")]

dies den Datenrahmen in der gleichen Reihenfolge wie der Tisch legen, oder Sie konnten uns einen temporären Datenrahmen

df_to_table<-df[c("A", "C", "B")]

Dann

sqlSave(channelToDb, dat = df_to_table, tablename = "tableDb", append = TRUE, 
rownames = FALSE, fast = FALSE) 

Wenn Sie Ihr enivronment sauber und klein halten wollen, dann entfernen Sie die temporäre Tabelle nach ...

rm(df_to_Table)

und Sie sind zurück zu Ihrem ursprünglichen Arbeitsraum mit dem Original df in Ihrer Umgebung und Ihre Variablen werden in der richtigen Reihenfolge in Ihrer Tabelle gespeichert.

+0

Ja, natürlich wäre das eine Option und ich mache es gerade so. Aber mein realer Welttisch hat noch mehrere Spalten und ich dachte, es gibt einen besseren Weg dazu. – schluk5

+0

Sie könnten selbst eine Funktion schreiben, die die Feldnamen aus der Datenbank liest und sie als Liste in einen temporären Rahmen einfügt und dann den Ausgang speichert. Sie müssten nur den Datenbanknamen, den Datenrahmen und einen Dateinamen angeben und alles für Sie erledigen. – sconfluentus