R中的组合和排列

Eva*_*eno 1 r

我有一个非常大的数据框架但是为了这个问题,让我们考虑下面的一个子集;

i j k l m n o p q
1 1 1 1 1 1 3 4 4
1 1 1 1 1 1 4 3 4
1 1 1 1 1 1 4 4 3
1 1 1 1 1 2 2 4 4
1 1 1 1 1 2 3 3 4
1 1 1 1 1 2 3 4 3
Run Code Online (Sandbox Code Playgroud)

在上述数据帧中,行中的值可以以特定数量的方式排列; 例如,让我们考虑第一行是(1,1,1,1 1,1,3,4,4).任何在R中计算这种方式的帮助都将受到高度赞赏.

jos*_*ber 5

您可以使用以下公式计算每行的唯一排列数:

apply(dat, 1, function(x) factorial(length(x)) / prod(factorial(table(x))))
# [1]  252  252  252  756 1512 1512
Run Code Online (Sandbox Code Playgroud)

如果一行长度为n的所有元素都是唯一的,那么就会有n!(n阶乘)排列.但是,如果每个j个唯一元素都有k1,k2,...,kj的总副本,那么我们可以通过除以k1来反转重复的过度计数!*k2!*...*kj!.大约有多项系数更多细节在这里.

如果两行具有相同的元素(可能以不同的顺序排列),那么它们的所有排列也将是相同的.我们可以通过检查重复的有序行来考虑这一点:

apply(dat, 1, function(x) factorial(length(x)) / prod(factorial(table(x)))) *
  !duplicated(t(apply(dat, 1, sort)))
# [1]  252    0    0  756 1512    0
Run Code Online (Sandbox Code Playgroud)