2017-06-02 3 views
0

Hier mein Beispiel data.frame:durch Füllen Gruppen in einem data.frame

df = read.table(text = 'ID Day Count Count_group 
       18 1933 6 15 
       33 1933 6 15 
       37 1933 6 15 
       18 1933 6 15 
       16 1933 6 15 
       11 1933 6 15 
       111 1932 5 9 
       34 1932 5 9 
       60 1932 5 9 
       88 1932 5 9 
       18 1932 5 9 
       33 1931 3 4 
       13 1931 3 4 
       56 1931 3 4 
       23 1930 1 1 
       6 1800 6 12 
       37 1800 6 12 
       98 1800 6 12 
       52 1800 6 12 
       18 1800 6 12 
       76 1800 6 12 
       55 1799 4 6 
       6 1799 4 6 
       52 1799 4 6 
       133 1799 4 6 
       112 1798 2 2 
       677 1798 2 2 
       778 888  4 8 
       111 888  4 8 
       88 888  4 8 
       10 888  4 8 
       37 887  2 4 
       26 887  2 4 
       8 886  1 2 
       56 885  1 1 
       22 120  2 6 
       34 120  2 6 
       88 119  1 6 
       99 118  2 5 
       12 118  2 5 
       90 117  1 3 
       22 115  2 2 
       99 115  2 2', header = TRUE) 

Count Spalte die Anzahl der ID Beobachtungen innerhalb eines Day zeigt; Count_group zeigt die Anzahl der ID Beobachtungen innerhalb einer Day und ihre vorherigen 4 Tage.

Ich muss df erweitern, um alle Tage innerhalb jeder Count_group Episoden zu haben.

Erwartete Ausgabe:

ID Day Count Count_group 
18 1933 6 15 
33 1933 6 15 
37 1933 6 15 
18 1933 6 15 
16 1933 6 15 
11 1933 6 15 
111 1932 5 15 
34 1932 5 15 
60 1932 5 15 
88 1932 5 15 
18 1932 5 15 
33 1931 3 15 
13 1931 3 15 
56 1931 3 15 
23 1930 1 15 
6 1800 6 12 
37 1800 6 12 
98 1800 6 12 
52 1800 6 12 
18 1800 6 12 
76 1800 6 12 
55 1799 4 12 
6 1799 4 12 
52 1799 4 12 
133 1799 4 12 
112 1798 2 12 
677 1798 2 12 
111 1932 5 9 
34 1932 5 9 
60 1932 5 9 
88 1932 5 9 
18 1932 5 9 
33 1931 3 9 
13 1931 3 9 
56 1931 3 9 
23 1930 1 9 
778 888 4 8 
111 888 4 8 
88 888 4 8 
10 888 4 8 
37 887 2 8 
26 887 2 8 
8 886 1 8 
56 885 1 8 
55 1799 4 6 
6 1799 4 6 
52 1799 4 6 
133 1799 4 6 
112 1798 2 6 
677 1798 2 6 
22 120 2 6 
34 120 2 6 
88 119 1 6 
88 119 1 6 
99 118 2 6 
12 118 2 6 
99 118 2 6 
12 118 2 6 
90 117 1 6 
90 117 1 6 
22 115 2 6 
99 115 2 6 
99 118 2 5 
12 118 2 5 
90 117 1 5 
22 115 2 5 
99 115 2 5 
33 1931 3 4 
13 1931 3 4 
56 1931 3 4 
23 1930 1 4 
37 887 2 4 
26 887 2 4 
8 886 1 4 
56 885 1 4 
90 117 1 3 
22 115 2 3 
99 115 2 3 
112 1798 2 2 
677 1798 2 2 
8 886 1 2 
56 885 1 2 
22 115 2 2 
99 115 2 2 
23 1930 1 1 
56 885 1 1 

Erklärung der Ausgabe:

1) Tag 1933 6-IDs auf diesem genauen Tag (Count col) und 15 IDs insgesamt von Tag 1933 bis Tag bekommen hat 1929 (Count_group col). Der Wert 15 kommt von 6 (Tag 1933) + 5 (1932) + 3 (1931) + 1 (1930) + 0 (1929). Also habe ich in der Ausgabe alle verbleibenden Tage innerhalb der Count_group = 15 Episode hinzugefügt.

2) Nächster Tag in absteigender Reihenfolge ist 1932. Mit 5 IDs an diesem genauen Tag und 9 IDs insgesamt von Tag 1932 bis Tag 1928. Der Wert 9 ergibt sich aus 5 (1932) + 3 (1931) + 1 (1930) + 0 (1929) + 0 (1928). Und in der Ausgabe (Zeile 28) sehen Sie die komplette Episode des Tages 1932 (5 Tage) mit insgesamt 9 Zeilen.

3) Next Day 1931..etc ist, etc ..

Der Ausgang data.frame rangiert von Count_group und Tag, beide fallend = TRUE.

Ich versuche einen Code zu erstellen, der nicht nur für ein 5-Tage-Fenster (wie oben) funktioniert, sondern für ein beliebiges Zeitfenster von n Tagen.

Haben Sie Vorschläge?

Dank

+0

ok..could Sie haben einen Versuch? – aaaaa

+0

Ich verstehe nicht ganz, wie Sie von den Daten zur erwarteten Ausgabe kommen, aber Sie könnten wahrscheinlich ['tidyr :: complete()'] (http://tidyr.tidyverse.org/reference/complete.html) verwenden. Vielleicht sehen Sie diese [Frage] (https://stackoverflow.com/questions/44271398/for-loops-inclusive-rows-in-a-dataframe-by-the-missing-values-of-factor-levels/44271839#44271839) oder [diese] (https://stackoverflow.com/questions/10438969/fastest-way-to-add-rows-for-missing-values-in-a-data-frame/44272077#44272077). – austensen

+0

Ich bin ein wenig verwirrt. Wie erstellen wir neue Zeilen für Sie? Wie lauten die Regeln? Notieren Sie sich den Prozess, bei dem Sie nicht herausfinden können, wie Sie programmieren sollen. Wie berechnen wir neue Werte in jeder dieser Spalten, um Ihnen zu helfen? Bitte posten Sie die Antwort als Bearbeitung Ihrer Frage. –

Antwort

0

diese ausprobieren und mir sagen, ob dies ist, was Sie dachten:

# First I split the dataframe by each day using split() 
duplicates <- lapply(split(df, df$Day), function(x){ 
    if(nrow(x) != x[1,"Count_group"]) { # check if # of rows != the number you want 
    x[rep(1:nrow(x), length.out = x[1,"Count_group"]),] # repeat them until you get it 
    } else { 
    x 
    } 
}) 

df2 <- do.call("rbind.data.frame", duplicates) # turn the list back into a dataframe 
df3 <- df2[order(df2[,"Count_group"], df2[,"Day"], decreasing = T), ] # orderby Day & count 
rownames(df3) <- NULL # names back to 1:X instead of the generated ones 
df3 # the result 
Verwandte Themen