2013-02-22 8 views
7

Ich muss Daten aus einer CSV-Datei, die überwiegend sich wiederholende Daten enthält, reorganisieren. Ich habe die Daten in einem Datenrahmen in R importiert, aber Ich habe Probleme mit dem folgenden:Reorganisieren von Daten aus 3 Zeilen zu 1

ID Language Author Keyword 
12 eng  Rob  COLOR=Red 
12 eng  Rob  SIZE=Large 
12 eng  Rob  DD=1 
15 eng  John  COLOR=Red 
15 eng  John  SIZE=Medium 
15 eng  John  DD=2 

Was ich tun muß, ist dies mit jedem Schlüsselwort in einer separaten Spalte in eine Reihe zu verwandeln

ID Language Author COLOR SIZE  DD 
12 eng  Rob  Red Large  1 

Irgendwelche Ideen?

Antwort

7

das reshape2 Paket Mit diesem einfach ist:

Mit tt definiert wie in Gary's answer

library("reshape2") 

tt <- cbind(tt, colsplit(tt$Keyword, "=", c("Name", "Value"))) 
tt_new <- dcast(tt, ID + Language + Author ~ Name, value.var="Value") 

die

> tt_new 
    ID Language Author COLOR DD SIZE 
1 12  eng Rob Red 1 Large 
2 15  eng John Red 2 Medium 
+0

Ich bin in der Lage, dies zu arbeiten, aber nach dem Ausführen der dcast() bekomme ich eine Fehlermeldung: Aggregationsfunktion fehlt: Standard auf Länge. Ich bekomme dann eine 1 in jeder der neuen Variablen. Ich vermute, dass es im realen Datensatz etwas geben muss, das nicht richtig ist, da es in diesem vereinfachten Datensatz gut funktioniert. Irgendwelche Ideen? – Ray

+0

Es scheint, dass ich irgendwo ungleiche Zahlen habe. Sie müssen herausfinden, wie Sie die ID mit mehr als 3 Zeilen finden und aufräumen. – Ray

+0

Sie erhalten diese Warnung, wenn eine Kombination aus 'ID',' Sprache', 'Autor' und' Name' mehr als einmal angezeigt wird. Sie können feststellen, welche es ist/diejenigen, die sie sind, indem Sie einen anderen Wert als 1 im Ergebnis suchen (im Wesentlichen, wenn es mehrere Werte für eine Kombination gibt, wird die Umformung sie irgendwie zu einem einzigen Wert aggregieren, und standardmäßig das irgendwie zählt nur, wie viele es gibt). –

6

Mit plyr ans strsplit Sie etwas tun können:

library(plyr) 
res <- ddply(dat,.(ID,Language,Author),function(x){ 
     unlist(sapply(strsplit(x$Keyword,'='),'[',2)) 
}) 

colnames(res)[4:6] <- c('COLOR','SIZE','DD') 

ID Language Author COLOR SIZE DD 
1 12  eng Rob Red Large 1 
2 15  eng John Red Medium 2 

Edit: Hier ist eine Verallgemeinerung, die @ Brian Sorge befasst:

res <- ddply(dat,.(ID,Language,Author), function(x){ 
      kv <- strsplit(x$Keyword, '=') 
      setNames(sapply(kv, `[`, 2), 
         sapply(kv, `[`, 1)) }) 
+0

ja gibt, dass schöneren ;-) –

+2

sind als Punkt der Vorsicht, dies tut Angenommen, die Schlüsselwörter sind immer 'FARBE',' GRÖSSE' und 'DD' und immer in dieser Reihenfolge. Wenn diese Annahme wahr ist, funktioniert das gut. –

+0

@flodel danke für die elegante Bearbeitung. – agstudy

1

diese reshape2 mit Versuchen:

tt <- read.table(header=T,text='ID Language Author Keyword 
12 eng  Rob  COLOR=Red 
12 eng  Rob  SIZE=Large 
12 eng  Rob  DD=1 
15 eng  John  COLOR=Red 
15 eng  John  SIZE=Medium 
15 eng  John  DD=2') 

tt$Keyword <- as.character(tt$Keyword) 

tt <- transform(tt, key_val = lapply(tt$Keyword,function(x) strsplit(x,'=')[[1]][2]), 
key_var = lapply(tt$Keyword,function(x) strsplit(x,'=')[[1]][1])) 

tt_new <- dcast (tt, ID + Language + Author ~ key_var, value.var='key_val') 
+0

Sind Sie sicher, dass das funktioniert ..? – agstudy

+0

Ihre 'lapply's sollten' sapply's sein und Sie brauchen ein 'value.var =" key_val "' in Ihrem 'dcast' Aufruf. –

+0

Habe nicht erkannt, dass 'value.var' die Variable in Anführungszeichen benötigt, also gab es einen Fehler. Ich habe es weggelassen, aber "dcast" hat in diesem Fall die richtige Variable richtig geschätzt. Vielen Dank. –

Verwandte Themen