R中的组合和排列

时间:2015-07-22 18:05:57

标签: 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

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

1 个答案:

答案 0 :(得分:5)

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

apply(dat, 1, function(x) factorial(length(x)) / prod(factorial(table(x))))
# [1]  252  252  252  756 1512 1512

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

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

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