所有四分之一数据的排列

时间:2016-08-02 19:24:12

标签: r permutation

我有一个包含8年季度数据的数据集。如果我从其中一年中随机选择每个季度我理论上可以构建一个新的"年。例如:新年= Q1(2009),Q2(2012),Q3(2010),Q4(2015)。

我遇到的问题是,我想构建一个包含所有这些排列的数据集。有8年零4个季度可以给我4 ^ 8 = 65536" new"年份。这是用嵌套循环解决的最好的东西,还是那些可以更好地工作的函数?

3 个答案:

答案 0 :(得分:1)

我们可以使用expand.grid创建所有可能组合的矩阵:

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

答案 1 :(得分:0)

你可能想稍等一下,看看有人给你一个不那么“笨拙”的答案,但是这个例子需要一个时间序列,在每年内都没有重复的宿舍,并且返回那些新的年份值旧年和季度信息为列。

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

所以要做的是

1,采用时间序列的所有可能组合

2,删除所有重复项,以便每个年份都没有相同的季度。

# 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

这是一个非常记忆密集的答案。如果有人可以跳过“制作所有可能的组合”步骤,那么这将是一项重大改进。

答案 2 :(得分:0)

我认为你想要超过4个季度的8年组合,所以组合的数量是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

每一行都是一年,Var1,Var2,Var3,Var4是4个季度。