枚举所有对排列而不使用许多嵌套的“for”循环

时间:2016-04-04 20:09:14

标签: r for-loop permutation

我彻底完成了这个问题的答案,但我一无所获。

假设我有两个样本大小为4的成对观察样本。我的目标是执行一个精确的置换集来比较样本均值,并执行我需要生成所有可能的对置换的程序,即I必须产生16种不同的排列(第一对有2种可能,第二对有两种......等等。)

也就是说,如果我的样本是:

#samples
x <- rnorm(4,0,1)
y <- rnorm(4,5,1)

#statistic over the original samples
dif0 <- mean(x) - mean(y)

我可以使用4个嵌套的“for”循环生成所有可能的排列,如下所示:

d1 < c()
d2 <- c()
samp_ab <- data.frame("x"=x,"y"=y)
ind <- 1:2
for (i1 in 1:2) 
{
    d1[1] <- samp_ab[1,ind[i1]]  
    d2[1] <- samp_ab[1,ind[-i1]] 
    for (i2 in 1:2) {  
        d1[2] <- samp_ab[2,ind[i2]]  
        d2[2] <- samp_ab[2,ind[-i2]] 
        for (i3 in 1:2) {  
            d1[3] <- samp_ab[3,ind[i3]]  
            d2[3] <- samp_ab[3,ind[-i3]]  
            for (i4 in 1:2) { #loop4
                d1[4] <- samp_ab[4,ind[i4]]  
                d2[4] <- samp_ab[4,ind[-i4]]  

                #compute the statistic
                k = k + 1 #counter
                S[k] <- mean(d1) - mean(d2)
            }
        }
    }
}   

这段代码有可能被简化吗?我想到了一个“写”嵌套循环然后执行它的函数......但我不知道该怎么做。我想获得配对样本的一般过程(甚至是组合三个元素),而不需要编写许多嵌套循环。例如,我必须使用n = 10,这导致10个循环...只是创建1024(2 ^ 10)个排列。

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

这似乎是R,我不熟悉,但对于排列,你想要一个笛卡尔积。查看以下解决方案:

Cartesian product data frame in R

How to do cross join in R?