R 四次数据的所有置换

R 四次数据的所有置换,r,permutation,R,Permutation,我有一个包含8年季度数据的数据集。如果我从一年中随机选择每个季度,理论上我可以构建一个新的一年。例如:新年=2009年第1季度、2012年第2季度、2010年第3季度、2015年第4季度 我的问题是,我想构造一个包含所有这些排列的数据集。8年4个季度,这将给我带来4^8=65536个新年。这是最好用嵌套循环解决的问题,还是有更好的功能?我们可以使用expand.grid创建一个包含所有可能组合的矩阵: nrow(do.call('expand.grid', replicate(8, 1:4, s

我有一个包含8年季度数据的数据集。如果我从一年中随机选择每个季度,理论上我可以构建一个新的一年。例如:新年=2009年第1季度、2012年第2季度、2010年第3季度、2015年第4季度

我的问题是,我想构造一个包含所有这些排列的数据集。8年4个季度,这将给我带来4^8=65536个新年。这是最好用嵌套循环解决的问题,还是有更好的功能?

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

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

您可能需要等待一段时间,看看是否有人给了您一个不那么“僵硬”的答案,但本例采用时间序列,采用所有排列,在每年内没有重复的季度,并返回那些新的年份值,以旧的年份和季度信息作为列

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

这是一个记忆密集型的答案。如果有人可以跳过“创建所有可能的组合”步骤,那么这将是一个显著的改进。

我认为您希望在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是四个季度。

你所说的不是数学意义上的排列。阅读该标签的信息或@Frank:你实际上是对的。我收回我的评论。不,我认为他们想要每年一个季度,而不是每季度一年。这就是为什么他们的数字比你的4096大。谢谢你的回复。我处理的是一个相当大的数据集,所以内存使用可能是一个问题,但这给了我一个很好的起点。@PaulGreeley如果你的数据值八年,这应该没问题