2014-12-03 2 views
5

Es liegt ein Problem mit der Dummy-Codierung des folgenden Datasets vor.Umwandeln von eindeutigen Funktionen in Spalten in Variablennamen und Dummy-Codieren von Originalfunktionen in Variablen in R

Beispiel Daten, können sagen, Datenrahmen = mydata:

ID |  NAMES  | 
-- | -------------- | 
1 | 4444, 333, 456 | 
2 | 333   | 
3 | 456, 765  | 

Ich mag würde nur die eindeutigen Variablen in Namen als Spaltenvariablen und Code werfen, wenn jede Zeile, die Variable hat oder nicht, dh 1 oder 0

gewünschte Ausgabe:

ID |  NAMES  | 4444 | 333 | 456 | 765 | 
-- | -------------- |------|-----|-----|-----| 
1 | 4444, 333, 456 | 1 | 1 | 1 | 0 | 
2 | 333   | 0 | 1 | 0 | 0 | 
3 | 456, 765  | 0 | 0 | 1 | 1 | 

, was ich bisher erstellt einen Vektor von einzigartigen

getan haben
split <- str_split(string = mydata$NAMES,pattern = ",") 

vec <- unique(str_trim(unlist(split))) 
remove <- "" 
vec <- as.data.frame(vec[! vec %in% remove]) 
colnames(vec) <- "var" 
vecRef <- as.vector(vec$var) 

namesCast <- dcast(data = vec,formula = .~var) 
namesCast <- nameCast[,2:ncol(namesCast)] 

Dies ergibt einen Vektor eindeutiger NAMEN mit entfernten Leerzeichen/Unregelmäßigkeiten. Von dort habe ich keine Idee, wie man die Abgleich-/Attrappencodierung tut, also würde jede mögliche Hilfe sehr geschätzt werden!

Antwort

5

Sie cSplit_e von meinem „splitstackshape“ Paket verwenden können, wie folgt aus:

library(splitstackshape) 
cSplit_e(mydata, "NAMES", sep = ",", type = "character", fill = 0) 
# ID   NAMES NAMES_333 NAMES_4444 NAMES_456 NAMES_765 
# 1 1 4444, 333, 456   1   1   1   0 
# 2 2   333   1   0   0   0 
# 3 3  456, 765   0   0   1   1 

Wenn Sie die zugrundeliegende Funktion sehen wollen, die aufgerufen wird, wenn Sie diese Argumente verwenden, können Sie bei splitstackshape:::charMat suchen, die nimmt a list generiert von strsplit und erstellt eine matrix daraus.

Funktion aufrufen direkt würde Ihnen etwas wie folgt aus:

splitstackshape:::charMat(
    lapply(strsplit(as.character(mydata$NAMES), ","), 
     function(x) gsub("^\\s+|\\s$", "", x))) 
#  333 4444 456 765 
# [1,] 1 1 1 NA 
# [2,] 1 NA NA NA 
# [3,] NA NA 1 1 
+0

Ha ich jemand wusste, dass nur Comeback mit einer Codezeile, die meiner Meinung nach bläst. Danke, es funktioniert super! – moku

Verwandte Themen