2017-05-05 3 views
0

Ich möchte neue Zeilen in einem dat.frame für alle fehlenden Jahre für jede Gruppe (Firma und Typ) erstellen. Die Datenrahmen sieht wie folgt aus:Fügen Sie Zeilen mit fehlenden Jahren nach Gruppe hinzu

minimal <- data.frame(firm = c("A","A","A","B","B","B","A","A","A","B","B","B"), 
        type = c("X","X","X","X","X","X","Y","Y","Y","Y","Y","Y"), 
        year = c(2000,2004,2007,2010,2008,2001,2002,2003,2007,2000,2001,2008), 
        value = c(1,3,7,9,9,2,3,3,7,5,9,15) 
       ) 

Datenrahmen:

firm type year value 
A X 2000  1 
A X 2004  3 
A X 2007  7 
B X 2010  9 
B X 2008  9 
B X 2001  2 
A Y 2002  3 
A Y 2003  3 
A Y 2007  7 
B Y 2000  5 
B Y 2001  9 
B Y 2008 15 

Nun, was ich will, ist folgendes zu erhalten: Ich kann in den Daten sehen, dass die Mindest-Jahr 2000 ist und das Maximum 2010. Ich möchte eine Zeile für jedes fehlende Jahr für jede Kombination von Unternehmen hinzufügen. Zum Beispiel für Unternehmen A und Typ X, würde Ich mag Zeilen hinzufügen, so dass es wie folgt aussieht:

fertige Ausgabe:

firm type year value 
A X 2000  1 
A X 2004  3 
A X 2007  7 
A X 2001  1 
A X 2002  1 
A X 2003  1 
A X 2005  3 
A X 2006  3 
A X 2008  7 
A X 2009  7 
A X 2010  7 

Zusätzlich möchte ich den Wert aus dem Vorjahr in die Spalte schreiben ' Wert 'für die fehlende Zeile für alle folgenden Jahre, bis eine neue nicht fehlende Zeile erscheint (wie im letzten Ausgabebeispiel zu sehen).

Ich habe noch nicht mit nützlichem Code kommen, aber was ich bisher ist folgende festgestellt, die die richtige Richtung sein könnten:

setDT(minimal)[, .SD[match(2000:2010, year)], 
          by = c("firm","type")] 

ich nicht wirklich das Konzept der setDT verstehen und .SD, aber dies erzeugt mindestens eine Zeile für jede Firm-Typ-Kombination. Es gibt jedoch keinen Inhalt für das Jahr.

Vielen Dank im Voraus!

+0

Ich denke, es gibt Betrüger dafür. Überprüfen Sie, ob '' complete' ''tidyr'' oder '' expand.grid '' 'base R'' oder' CJ' von 'data.table' ist. – akrun

+0

Okay, ich habe 'min2 <- expand.grid (year = min (minimales $ Jahr): max (minimales $ Jahr), fest = einzigartig (minimal $ fest), typ = eindeutig (minimal $ type)) ' und' merge (min2, minimal, durch = c ("Firma", "Typ "," Jahr "), all.x = T)'. Jetzt muss ich nur noch die richtigen Werte zu jeder Zeile hinzufügen, was ich jetzt noch nicht mache. – Rnewbie

+0

versuchen Sie dies: 'Bibliothek (dplyr); Bibliothek (Tidyr); minimal%>% group_by (Firma, Typ)%>% komplett (Jahr = full_seq (Jahr, 1))%>% fill (Wert) ' – Sotos

Antwort

0

Ich schrieb diesen Code, den Sie, was Sie, vielleicht ist es nicht so effizient oder elegant, aber es funktioniert wollte:

# Input dataframe 
minimal <- data.frame(firm = c("A","A","A","B","B","B","A","A","A","B","B","B"), 
         type = c("X","X","X","X","X","X","Y","Y","Y","Y","Y","Y"), 
         year = c(2000,2004,2007,2010,2008,2001,2002,2003,2007,2000,2001,2008), 
         value = c(1,3,7,9,9,2,3,3,7,5,9,15) 
) 

# Sorting is needed 
minimal = minimal[order(minimal$firm, minimal$type, minimal$year),] 

# Variables used 
table = table(minimal$firm=="A", minimal$type=="X") 
minYear = min(minimal$year) 
maxYear = max(minimal$year) 
startPos = 0 

# Iterates the dataframe 
for(i in 1:2){ 
    for(j in 1:2){ 
    prevValue = 0 
    currYear = minYear 

    # Adds minimum year if needed 
    if(minimal$year[1+startPos] != currYear){ 
     newRow = c(as.character(minimal$firm[1+startPos]), as.character(minimal$type[1+startPos]), currYear, prevValue) 
     minimal = rbind(minimal, newRow) 
    } 

    # Adds years 
    for(k in (1+startPos):(table[i,j]+startPos)){ 
     if(minimal$year[k]!=currYear){ 
     currYear = currYear + 1 
     while(minimal$year[k]!=currYear){ 
      newRow = c(as.character(minimal$firm[k]), as.character(minimal$type[k]), currYear, prevValue) 
      minimal = rbind(minimal, newRow) 
      currYear = currYear + 1 
     } 
     } 
     prevValue = minimal$value[k] 
    } 

    # Adds years from last to maximum 
    if(currYear < maxYear){ 
     for(l in 1:(maxYear - currYear)){ 
     newRow = c(as.character(minimal$firm[k]), as.character(minimal$type[k]), currYear+l, prevValue) 
     minimal = rbind(minimal, newRow) 
     } 
    } 
    startPos = startPos + table[i,j] 

    } 
} 

# Result 
minimal = minimal[order(minimal$firm, minimal$type, minimal$year),] 
minimal 
0

Ich konnte keine genaue Betrogene für diese so ist hier eine mögliche Lösung,

finden
library(dplyr) 
library(tidyr) 

minimal %>% 
    group_by(firm, type) %>% 
    complete(year = full_seq(2000:2010, 1)) %>% 
    fill(value) 
0

Hier ist eine data.table Lösung.

library(data.table) 

dt <- setDT(minimal)[CJ(firm=firm, type=type, year=seq(min(year), max(year)), unique=TRUE), 
       on=.(firm, type, year), roll=TRUE] 

Das gibt

head(dt, 15) 
    firm type year value 
1: A X 2000  1 
2: A X 2001  1 
3: A X 2002  1 
4: A X 2003  1 
5: A X 2004  3 
6: A X 2005  3 
7: A X 2006  3 
8: A X 2007  7 
9: A X 2008  7 
10: A X 2009  7 
11: A X 2010  7 
12: A Y 2000 NA 
13: A Y 2001 NA 
14: A Y 2002  3 
15: A Y 2003  3 

Beachten Sie, dass die ersten Reihen des zweiten festen Typ Combo sind NA. Wenn Sie diese mit dem folgenden Jahr füllen möchten, können Sie das Argument von fill auf "nearest" einstellen, obwohl dies die Werte in der Mitte der Daten beeinflussen könnte.

Verwandte Themen