【问题标题】:Unordered combinations and generating related index-vectors in RR中的无序组合和生成相关索引向量
【发布时间】:2015-11-19 01:25:36
【问题描述】:

假设我有一个包含三个人ABC 的数据,每个人都有两个状态(12)。这些组合是:ABCABACBCABC(即 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"
    

    【讨论】:

    • 感谢您的回答@eitnne。我想知道是否有任何方法可以将组合重新排序为ABCABACBCABC
    • 知道了,谢谢。还有一个问题,如果它还可以。你介意向我解释一下这段代码吗? IV[order(sapply(1:nrow(IV),function(x){nchar(row.names(IV)[x])}),row.names(IV))‌​,] 对我来说,它似乎先订购sapply 零件,然后订购row.names(IV) 零件。代码顺序是这样工作的吗?谢谢! @eitnne
    • @tzu:代码分为两部分:首先,它获取每个行名的字符数nchar,并按这些长度排序IV(长度为1,然后为2 ...) ,其次,它按字母顺序对这些组进行排序。您的评论是对的,因为第一个订单 (nchar) 的优先级高于第二个。
    • 非常感谢! @etienne
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多