2014-05-12 65 views
1

我有一个包含IDNum,Var1,Var2,Var3,Var4,Var5,Var6列的大型数据集。变量是布尔值,其值为0或1.每行可以是64种不同的可能排列之一。我想计算每个排列对应的行数。有没有一种有效的方式来写在R?计算R中的现有排列

+0

它不是置换,它的变化。请参阅[本图表](http://users.telenet.be/vdmoortel/dirk/Maths/PermVarComb.html)。用这个比喻:“你可以用2位数字0,1来做6个数字的数字吗?” – Kicsi

回答

1

aggregate可以做到这一点。这里有一个更短的例子:

r <- function() rbinom(10, 1, .5) 
d <- data.frame(IDNum=1:10, Var1=r(), Var2=r()) 
d 
    IDNum Var1 Var2 
1  1 0 1 
2  2 0 1 
3  3 0 0 
4  4 1 0 
5  5 1 1 
6  6 0 0 
7  7 1 1 
8  8 1 0 
9  9 0 1 
10 10 0 1 

我们计算每个组合的数量:

> aggregate(d$IDNum, d[-1], FUN=length) 
    Var1 Var2 x 
1 0 0 2 
2 1 0 2 
3 0 1 4 
4 1 1 2 

d$IDNum值实际上并没有在这里使用,但是必须采取某种传递给length功能。将每个组合的d$IDNum中的值传递给length以获得计数。

+0

两个很好的解决方案,谢谢!我将与#1一起进行,因为它完全符合我希望的,非常简单/紧凑,并且使用了聚合,我需要将其添加到我的词汇表中。第二个也是一个很好的学习opp。 – marcel

1

这会给出稍微不同的结果,并列出所有可能性,无论它们是否存在。示例数据:

nam <- c("IDNum",paste0("Var",1:6)) 
n <- 5 
set.seed(23) 
dat <- setNames(data.frame(1:n,replicate(6,sample(0:1,n,replace=TRUE))),nam) 


# IDNum Var1 Var2 Var3 Var4 Var5 Var6 
#1  1 1 0 1 0 1 1 
#2  2 0 1 1 1 0 1 
#3  3 0 1 0 1 0 1 
#4  4 1 1 0 1 1 0 
#5  5 1 1 1 1 0 1 

计数举起手来:

data.frame(table(dat[-1])) 

# Var1 Var2 Var3 Var4 Var5 Var6 Freq 
#1  0 0 0 0 0 0 0 
#... 
#28 1 1 0 1 1 0 1 
#... 
#43 0 1 0 1 0 1 1 
#... 
#47 0 1 1 1 0 1 1 
#48 1 1 1 1 0 1 1 
#... 
#54 1 0 1 0 1 1 1 
#... 
#64 1 1 1 1 1 1 0