2016-07-31 9 views
1

Angenommen, ich Daten haben, die das folgende Format hat:One Hot Encoding aus mehreren Zeilen in R

ID VALUE 
a a 
a b 
d b 
d c 

Was würde ich ein One-hot-Codierung für die ID-Wert zu tun. Wenn ich model.matrix verwenden, erhalte ich:

model.matrix(~VALUE-1, df) 

ID aVALUE bVALUE cVALUE 
a 1  0  0 
a 0  1  0 
d 0  1  0 
d 0  0  1 

Was Ich mag würde jedoch bekommen ist dies:

ID aVALUE bVALUE cVALUE 
a 1  1  0 
d 0  1  1 

Der andere Teil dazu ist, dass mein Datenrahmen rund 30 Millionen Zeilen ist - so ich bin auf der Suche nach einem effizienten Weg, dies zu tun. Jede Hilfe oder Kommentare würden sehr geschätzt werden!

Vielen Dank!

+0

@Jota - das funktioniert tatsächlich! Vielen Dank! – RDizzl3

+0

Wenn du es als Antwort posten willst, nehme ich es gerne an - @Jota – RDizzl3

Antwort

3

Sie könnten table verwenden.

d <- table(df$ID, df$VALUE) 
# a b c 
# a 1 2 0 
# d 0 1 1 

Wenn Sie Werte von 1 oder 0 erzwingen, da einige Kombinationen auftauchen mehr als einmal, dann können Sie diese Fälle zu 1 konvertieren:

d[d > 1L] <- 1 
# a b c 
# a 1 1 0 
# d 0 1 1 

Beispieldaten

df <- structure(list(ID = c("a", "a", "a", "d", "d"), VALUE = c("a", "b", "b", "b", "c")), 
    .Names = c("ID", "VALUE"), class = "data.frame", row.names = c(NA, -5L)) 
1

Eine Option ist dcast von data.table, um von 'lang' in 'Wide' Format zu konvertieren. Konvertieren Sie den 'data.frame' in 'data.table' (setDT(df)), ändern Sie ihn in 'wide'format mit dcast und geben Sie fun.aggregate an. Für große Datensätze wäre der dcast Ansatz schnell.

library(data.table) 
dcast(setDT(df), ID~paste0(VALUE, "VALUE"), value.var = "VALUE", 
       function(x) as.integer(length(x) > 0)) 
# ID aVALUE bVALUE cVALUE 
#1: a  1  1  0 
#2: d  0  1  1 

Eine weitere Option ist dplyr/tidyr

library(dplyr) 
library(tidyr) 
df %>% 
    unique() %>% 
    mutate(n = 1)%>% 
    spread(VALUE, n, fill = 0)