2014-12-03 8 views
5

Avendo un problema con la modalità di codice fittizio del seguente set di dati.Trasmissione di funzioni univoche nei nomi di variabile e codifica fittizia nelle caratteristiche originali in variabili in R

dati esempio, poniamo dataframe = mydata:

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

mi piacerebbe lanciare solo le variabili uniche in nomi come variabili di colonna e codice se ogni riga è quella variabile o meno ie 1 o 0

output desiderato:

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 | 

quello che ho fatto fino ad ora è stato creato un vettore di unico

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)] 

Questo produce un vettore di NAMES univoci con spazi/irregolarità rimossi. Da lì non ho idea di come fare la codifica matching/dummy, quindi qualsiasi aiuto sarebbe molto apprezzato!

risposta

5

È possibile utilizzare cSplit_e dal mio pacchetto "splitstackshape", in questo modo:

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 

Se volete vedere la funzione di fondo che viene chiamata quando si utilizzano tali argomenti, si può guardare splitstackshape:::charMat, che prende a list generato da strsplit e crea un matrix da esso.

chiamando direttamente la funzione darebbe qualcosa di simile:

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 sapevo che qualcuno avrebbe solo rimonta con una riga di codice che soffia la mia mente. Grazie funziona benissimo! – moku

Problemi correlati