2017-08-31 6 views
1

Wie erstelle ich neue Spalten, die Dummy-Variablen 1 und 0 enthalten, um die Beobachtung der Zeile anzuzeigen.Dplyr Dummy-Variablen-/Indikatorspalten für SQL-Tabellen erstellen

Ich möchte so etwas wie dies für die Spalte schaffen .. x

x y x_a x_b x_c 
1 a 4 1 0 0 
2 a 4 1 0 0 
3 b 5 0 1 0 
4 b 5 0 1 0 
5 c 5 0 0 1 
6 c 6 0 0 1 

Oder Spalte y

x y y_4 y_5 x_6 
1 a 4 1 0 0 
2 a 4 1 0 0 
3 b 5 0 1 0 
4 b 5 0 1 0 
5 c 5 0 1 0 
6 c 6 0 0 1 

ich dies geschafft, in der Basis R in neue Spalten mit ifelse.

Ich möchte dies in dplyr tun, damit es auf SQL-Tabellen arbeiten kann.

con <- DBI::dbConnect(RSQLite::SQLite(), path = "") 
dbWriteTable(con, "test",test) 
testdb <- tbl(con, "test") 
testdb %>% mutate(i = row_number(), i2 = 1) %>% spread(x, i2, fill = 0) 

Die Funktion row_number() funktioniert nicht auf SQL-Tabellen.

Fehler: Die Fensterfunktion row_number() wird von dieser Datenbank nicht unterstützt. Im SQLite ..

+0

'test%>% mutieren (i = row_number(), i2 = 1)%>% Spread (x, i2, fill = 0) 'könnte funktionieren. Aber warum nicht einfach 'model.matrix' verwenden? Oder noch besser: Matrix :: sparseMatrix() '? Weil es nicht tiblliverse ist? –

+0

Danke für Ihre Hilfe, ich muss es in dplyr schreiben, da es sql ähnlicher ist. – user8542010

+0

Ich bin nicht sicher, warum diese Frage als ein Duplikat von https://stackoverflow.com/questions/11952706/generate-a-dummy-variable markiert ist Ich frage nach einer dplyr Lösung, nicht Basis R. – user8542010

Antwort

0

Für x:

library(dplyr) 
    test %>% bind_cols(as_data_frame(setNames(lapply(unique(test$x), 
                function(x){as.integer(test$x == x)}), 
              paste0('x_', unique(test$x))))) 
     x y x_a x_b x_c 
    1 a 4 1 0 0 
    2 a 4 1 0 0 
    3 b 5 0 1 0 
    4 b 5 0 1 0 
    5 c 5 0 0 1 
    6 c 6 0 0 1 

Für y:

test %>% bind_cols(as_data_frame(setNames(lapply(unique(test$y), 
                function(x){as.integer(test$y == x)}), 
              paste0('y_', unique(test$y))))) 
    x y y_4 y_5 y_6 
1 a 4 1 0 0 
2 a 4 1 0 0 
3 b 5 0 1 0 
4 b 5 0 1 0 
5 c 5 0 1 0 
6 c 6 0 0 1 
+0

danke für ihre hilfe, aber ich möchte so viele basis r funktionen wie möglich zu vermeiden – user8542010

Verwandte Themen