2012-04-11 5 views
10

Ich versuche, einige Daten zu bereinigen, die falsch eingegeben wurde. Die Frage für die Variable erlaubt mehrere Antworten von fünf Auswahlmöglichkeiten, nummeriert als 1 bis 5. Die Daten wurden auf folgende Weise eingegeben (dies ist nur ein Beispiel - es gibt viel mehr Variablen und viele weitere Beobachtungen in den tatsächlichen Daten Rahmen):Teilen Sie eine Spalte von verketteten kommaseparierten Daten und recode-Ausgabe als Faktoren

data 
      V1 
1 1, 2, 3 
2 1, 2, 4 
3 2, 3, 4, 5 
4 1, 3, 4 
5 1, 3, 5 
6 2, 3, 4, 5 

Hier einige Code, die Beispieldaten zu erstellen:

data = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", 
         "1, 3, 4", "1, 3, 5", "2, 3, 4, 5")) 

Was ich brauche, sind eigentlich die Daten mehr behandelt werden ... binär - wie eine Reihe von „ja/keine "Fragen" - eingegeben in einem Datenrahmen, der eher wie folgt aussieht:

data 
    V1.1 V1.2 V1.3 V1.4 V1.5 
1  1  1  1 NA NA 
2  1  1 NA  1 NA 
3  NA  1  1  1  1 
4  1 NA  1  1 NA 
5  1 NA  1 NA  1 
6  NA  1  1  1  1 

Die aktuellen Variablennamen spielen im Moment keine Rolle - das kann ich leicht beheben. Es ist auch nicht so wichtig, ob die fehlenden Elemente "O", "NA" oder leer sind - auch das kann ich später beheben.

Ich habe versucht, mit der transform Funktion aus dem reshape Paket sowie eine andere Dinge mit strsplit gefüttert, aber ich kann nicht bekommen, entweder zu tun, was ich suche. Ich habe mir auch viele andere verwandte Fragen zu Stackoverflow angeschaut, aber sie scheinen nicht das selbe Problem zu sein.

Antwort

8

Sie müssen nur eine Funktion schreiben und apply verwenden. Zunächst einige Dummy-Daten:

##Make sure you're not using factors 
dd = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", 
         "1, 3, 4", "1, 3, 5", "2, 3, 4, 5"), 
        stringsAsFactors=FALSE) 

Nächstes erstellen eine Funktion, die in einer Reihe nimmt und wandelt wie nötig

make_row = function(i, ncol=5) { 
    ##Could make the default NA if needed 
    m = numeric(ncol) 
    v = as.numeric(strsplit(i, ",")[[1]]) 
    m[v] = 1 
    return(m) 
} 

Dann apply verwenden und das Ergebnis

t(apply(dd, 1, make_row)) 
+0

Hier ist ein Einzeiler automatisch den entsprechenden Wert von 'ncol' für Variable' V1' zu bestimmen: 'max (as.numeric (fehlende oder (strsplit (dd $ V1 ""))))' (unter der Annahme, dass die letzte der mehreren Antworten mindestens einmal als Antwort gegeben wurde) – BenBarnes

6

lange Zeit transponieren später kam ich schließlich dazu, ein Paket zu erstellen ("splitstackshape"), das diese Art von Daten auf effiziente Weise behandelt. Für die Bequemlichkeit anderer (und natürlich auch für Eigenwerbung) gibt es hier eine kompakte Lösung.

Die relevante Funktion für dieses Problem ist cSplit_e.

Zunächst werden die Standardeinstellungen, die die ursprüngliche Spalte und verwendet NA als Füllung behält:

library(splitstackshape) 
cSplit_e(data, "V1") 
#   V1 V1_1 V1_2 V1_3 V1_4 V1_5 
# 1 1, 2, 3 1 1 1 NA NA 
# 2 1, 2, 4 1 1 NA 1 NA 
# 3 2, 3, 4, 5 NA 1 1 1 1 
# 4 1, 3, 4 1 NA 1 1 NA 
# 5 1, 3, 5 1 NA 1 NA 1 
# 6 2, 3, 4, 5 NA 1 1 1 1 

Zweitens mit der ursprünglichen Säule fallen und mit 0 als Füllung.

cSplit_e(data, "V1", drop = TRUE, fill = 0) 
# V1_1 V1_2 V1_3 V1_4 V1_5 
# 1 1 1 1 0 0 
# 2 1 1 0 1 0 
# 3 0 1 1 1 1 
# 4 1 0 1 1 0 
# 5 1 0 1 0 1 
# 6 0 1 1 1 1 
Verwandte Themen