使用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"
謝謝您的回答@eitnne。我想知道是否有任何方法可以將組合重新排序爲A,B,C,AB,AC,BC,ABC? – tzu
@tzu:我編輯了答案 – etienne
明白了,謝謝。還有一個問題,如果沒關係。你介意向我解釋一下這段代碼嗎? 'IV [order(sapply(1:nrow(IV),function(x){nchar(row.names(IV)[x])}),row.names(IV)),]'對我來說,好像它先命令'sapply'部分,然後命令'row.names(IV)'部分。這是代碼順序的工作原理嗎?謝謝! @eitnne – tzu