2016-11-21 3 views
2

Ich bin mir sicher, dass es eine einfache Lösung für dieses Problem gibt, aber ich habe Probleme, es herauszufinden. Ich habe einen Datenrahmen in folgendem Format:Fehlende Zeilen nach Faktorebene einfügen

Number Category Type Count 
1  X  A  10 
2  X  B  14 
3  Y  B  3 
4  Z  A  14 

„Typ“ ist ein Faktor, mit zwei Ebenen, {A, B}, und jede Ebene bekommt mindestens eine „Kategorie“ -Eintrag, (der Einfachheit halber Sie werden hier als XYZ bezeichnet, aber in meinem aktuellen Datensatz sind zu viele, um sie aufzulisten). Ich mag die Anzahl der Zeilen jede Art von Kategorie zu passen hat:

Number Category Type Count 
1  X  A  10 
2  X  B  14 
3  Y  A  <NA> 
4  Y  B  3 
5  Z  A  14 
6  Z  B  <NA> 

Zum Beispiel, wenn Typ A in vier Reihen der Kategorie A aufgeführt ist, aber Typ B keine Kategorie A Inserate hat, dann vier neue Zeilen von Kategorie A sollte Typ B erstellt werden (mit Count = NA). Wenn Typ A vier Zeilen der Kategorie A erhält und Typ B zwei hat, sollten zwei neue Zeilen erstellt werden.

konnte ich zahlreiche Antworten darauf, wie dies zu tun für fehlende Termine in Zeitreihendaten mit seq(), expand.grid() und merge(), aber ich kann nicht ganz sehen, wie es zu tun in diesem Fall finden. Ich hoffe, das ist klar ... Dankbar für jede Hilfe!

dat <- read.table(header = TRUE, text = 
       "Number Category Type Count 
        1  X  A  10 
        2  X  B  14 
        3  Y  B  3 
        4  Z  A  14") 
+2

'tidyr :: complete (Daten, Kategorie, Typ)' – Khashaa

+0

So elegant, danke! – beddotcom

Antwort

2

Verwenden expand.grid um eine Master-Liste zu machen und dann merge:

alllevs <- do.call(expand.grid, lapply(dat[c("Type","Category")], levels)) 
merge(dat, alllevs, all.y=TRUE) 

# Category Type Number Count 
#1  X A  1 10 
#2  X B  2 14 
#3  Y A  NA NA 
#4  Y B  3  3 
#5  Z A  4 14 
#6  Z B  NA NA 
Verwandte Themen