2015-11-18 29 views
0

生成相關索引向量假設我有三個人ABC數據,和每一個都具有兩個狀態(12)。這些組合是:A,B,C,AB,AC,BCABC(即,2^2-1組合)。因此,我需要類似索引的向量來引用每個組合。例如,組合A的索引向量將是IV<-c(1, 2, 2)。對於另一個示例,組合AB的索引向量將爲IV<-c(1, 1, 2)。最後,組合ABC的索引向量將是IV<-c(1, 1, 1)無序組合和中的R

任何人都可以幫忙嗎?謝謝。

回答

1

使用expand.grid

IV<-expand.grid(2:1,2:1,2:1)[-1,] 
rownames(IV)<-c('A','B','AB','C','AC','BC','ABC'); colnames(IV)<-NULL 
IV<-as.matrix(IV) 

    IV 
    [,1] [,2] [,3] 
A  1 2 2 
B  2 1 2 
AB  1 1 2 
C  2 2 1 
AC  1 2 1 
BC  2 1 1 
ABC 1 1 1 

要使用矢量把名字用引號,不要忘了逗號:

IV['A',] 
[1] 1 2 2 

請注意,如果你想要做同樣的四(以上)的信件,你可以這樣做:

number<-4 
IV<-expand.grid(replicate(number,2:1,simplify=FALSE))[-1,]; colnames(IV)<-LETTERS[1:number] 
IV<-as.matrix(IV) 

# this will computes the rownames 
for (i in 1:nrow(IV)){ 
    temp<-'' 
    for (j in 1:ncol(IV)){ 
     if (all.equal(IV[i,j],1)==TRUE) { 
      temp<-paste0(temp,colnames(IV)[j]) 
     } 
    } 
    rownames(IV)[i]<-temp 
} 
colnames(IV)<-NULL 

對於順序,使用

IV<-IV[order(row.names(IV)),] 
IV<-IV[order(sapply(1:nrow(IV),function(x){nchar(row.names(IV)[x])})),] 

它可以在

IV[order(sapply(1:nrow(IV),function(x){nchar(row.names(IV)[x])}),row.names(IV)),] 

這將責令由字母順序排列的長度,使得它給縮短了,再:

rownames(IV) 
[1] "A" "B" "C" "D" "AB" "AC" "AD" "BC" "BD" "CD" "ABC" "ABD" "ACD" "BCD" 
[15] "ABCD" 
+0

謝謝您的回答@eitnne。我想知道是否有任何方法可以將組合重新排序爲A,B,C,AB,AC,BC,ABC? – tzu

+0

@tzu:我編輯了答案 – etienne

+0

明白了,謝謝。還有一個問題,如果沒關係。你介意向我解釋一下這段代碼嗎? 'IV [order(sapply(1:nrow(IV),function(x){nchar(row.names(IV)[x])}),row.names(IV)),]'對我來說,好像它先命令'sapply'部分,然後命令'row.names(IV)'部分。這是代碼順序的工作原理嗎?謝謝! @eitnne – tzu