R中的无序组合和生成相关索引向量

  • 本文关键字:索引 向量 无序 组合 r
  • 更新时间 :
  • 英文 :


假设我有一个数据,其中有三个个体ABC,每个个体都有两个状态(12)。组合为:ABCABACBCABC(即2^2-1组合)。因此,我需要类似索引的向量来引用每个组合。例如,组合A的索引向量将是IV<-c(1, 2, 2)。对于另一个示例,组合AB的索引向量将是IV<-c(1, 1, 2)。最后,组合ABC的索引向量将是IV<-c(1, 1, 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"

最新更新