假设我有三个人A
,B
和C
的数据,并且每个人都有两个状态(1
和2
) 。这些组合包括:A
,B
,C
,AB
,AC
,BC
和ABC
(即2 ^ 2-1组合)。因此,我需要类似索引的向量来引用每个组合。例如,组合A
的索引向量将为IV<-c(1, 2, 2)
。对于另一个示例,组合AB
的索引向量将为IV<-c(1, 1, 2)
。最后,组合ABC
的索引向量将为IV<-c(1, 1, 1)
。
有人可以帮忙吗?感谢。
答案 0 :(得分: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"