2014-05-12 80 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