2016-08-02 19 views
1

Ich habe einen Datensatz, der vierteljährliche Daten für 8 Jahre enthält. Wenn ich zufällig jedes Quartal aus einem der Jahre auswähle, könnte ich theoretisch ein "neues" Jahr konstruieren. Zum Beispiel: neues Jahr = Q1 (2009), Q2 (2012), Q3 (2010), Q4 (2015).Alle Permutationen von Quartely Daten

Das Problem, das ich habe, ist, dass ich einen Datensatz erstellen möchte, der alle solche Permutationen enthält. Mit 8 Jahren und 4 Quartalen hätte ich 4^8 = 65536 "neue" Jahre. Ist das am besten mit einer verschachtelten Schleife gelöst, oder gibt es Funktionen, die besser funktionieren könnten?

+0

Worüber Sie sprechen, sind keine Permutationen (im mathematischen Sinne). Lesen Sie die Info für dieses Tag oder http://mathworld.wolfram.com/Permutation.html – Frank

+1

@Frank: Sie sind tatsächlich richtig. Ich ziehe meinen Kommentar zurück. – aichao

Antwort

1

Wir können expand.grid verwenden, um eine Matrix aller möglichen Kombinationen zu erstellen:

nrow(do.call('expand.grid', replicate(8, 1:4, simplify=FALSE))) 
[1] 65536 
0

Sie möchten vielleicht ein bisschen warten, um zu sehen, ob jemand Ihnen eine weniger ‚janky‘ gibt Antwort, aber dieses Beispiel nimmt eine Zeit Reihe, nimmt alle Permutationen mit nicht wiederholten Vierteln innerhalb jedes Jahres, und gibt diese Neujahrswerte mit den alten Jahres- und Quartendaten als Spalten zurück.

set.seed(1234) 

# Make some fake data 
q_dat <- data.frame(year = c(rep(2011,4), 
          rep(2012,4), 
          rep(2013,4)), 
        quarters = rep(c("Q1","Q2","Q3","Q4"),3), 
        x = rnorm(12)) 
q_dat 

    year quarters   x 
1 2011  Q1 -1.2070657 
2 2011  Q2 0.2774292 
3 2011  Q3 1.0844412 
4 2011  Q4 -2.3456977 
5 2012  Q1 0.4291247 
6 2012  Q2 0.5060559 
7 2012  Q3 -0.5747400 
8 2012  Q4 -0.5466319 
9 2013  Q1 -0.5644520 
10 2013  Q2 -0.8900378 
11 2013  Q3 -0.4771927 
12 2013  Q4 -0.9983864 

Also, was tun wird, ist

1 alle möglichen Kombinationen der Zeitreihe

2 Entfernen Sie alle Duplikate so jeweils aus Jahr nicht das gleiche Quartal in er hat .

# Expand out all possible combinations of our three years 
q_perms <- expand.grid(q1 = 1:nrow(q_dat), q2 = 1:nrow(q_dat) , 
         q3 = 1:nrow(q_dat), q4 = 1:nrow(q_dat)) 

# remove any duplicate combinations 
# EX: So we don't get c(2011Q1,2011Q1,2011Q1,2011Q1) as a year 
q_perms <- q_perms[apply(q_perms,1,function(x) !any(duplicated(x))),] 

# Transpose the grid, remake it as a data frame, and lapply over it 
l_rand_dat <- lapply(data.frame(t(q_perms)),function(x) q_dat[x,]) 

# returns one unique year per list 
l_rand_dat[[30]] 
    year quarters   x 
5 2012  Q1 0.4291247 
6 2012  Q2 0.5060559 
2 2011  Q2 0.2774292 
1 2011  Q1 -1.2070657 


# bind all of those together 
rand_bind <- do.call(rbind,l_rand_dat) 

head(rand_bind) 

     year quarters   x 
X172.4 2011  Q4 -2.3456977 
X172.3 2011  Q3 1.0844412 
X172.2 2011  Q2 0.2774292 
X172.1 2011  Q1 -1.2070657 
X173.5 2012  Q1 0.4291247 
X173.3 2011  Q3 1.0844412 

Dies ist eine ziemlich speicherintensive Antwort. Wenn jemand den Schritt "Mach alle möglichen Kombinationen" überspringen kann, dann wäre das eine deutliche Verbesserung.

+0

Danke für die Antwort. Ich habe es mit einem ziemlich großen Datensatz zu tun, daher kann die Speichernutzung ein Problem darstellen, aber das gibt mir einen guten Ausgangspunkt. –

+0

@PaulGreeley Wenn Ihre Daten acht Jahre wert sind, sollte dies in Ordnung sein –

0

Ich glaube, Sie Kombinationen von den 8 Jahren über vier Viertel wollen so die Anzahl der Kombinationen 8^4 = 4096:

> x <- years <- 2008:2015 
> length(x) 
[1] 8 
> comb <- expand.grid(x, x, x, x) 
> head(comb) 
    Var1 Var2 Var3 Var4 
1 2008 2008 2008 2008 
2 2009 2008 2008 2008 
3 2010 2008 2008 2008 
4 2011 2008 2008 2008 
5 2012 2008 2008 2008 
6 2013 2008 2008 2008 
> tail(comb) 
    Var1 Var2 Var3 Var4 
4091 2010 2015 2015 2015 
4092 2011 2015 2015 2015 
4093 2012 2015 2015 2015 
4094 2013 2015 2015 2015 
4095 2014 2015 2015 2015 
4096 2015 2015 2015 2015 
> nrow(comb) 
[1] 4096 

Jede Zeile ist ein Jahr und Var1, Var2, Var3, Var4 sind die 4 Viertel.

+0

Nein, ich denke, sie wollen ein Viertel pro Jahr, nicht ein Jahr pro Quartal. Deshalb haben sie eine größere Anzahl als Ihr 4096. – Frank