首页 文章

与跨产品相反:如何从两个矩阵的交集创建一个新矩阵?

提问于
浏览
0

我在R(女性和男性)中有两张表,其中存在缺席数据 . 我想在它们之间进行成对比较(逐行),以找出每对之间不共享的细胞数量(即细胞总数等于1,而不是雄性,反之亦然) .

我知道交叉积(%*%)与我需要的完全相反 . 它创建了一个新的矩阵,其中包含男性和女性对之间共享单元格的总和(即,两个单元中的总和等于1) .

这是一个示例数据集:

females <- as.data.frame(matrix(c(0,0,0,1,1,0,1,0,1,0,1,0,1,0,1,1,1,0,1,1,1,0,1,1,1), nrow=5, byrow=T))
males <-  as.data.frame(matrix(c(1,0,0,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,1,0,1), nrow=5, byrow=T))
rownames(females) <-c ("female_1","female_2","female_3","female_4","female_5")
rownames(males) <-c ("male_1","male_2","male_3","male_4","male_5")

所以,如果我做交叉产品

as.matrix(females) %*% t(as.matrix(males))

我明白了

male_1 male_2 male_3 male_4 male_5
female_1      2      2      1      2      1
female_2      1      2      0      2      0
female_3      2      1      3      2      3
female_4      3      3      2      4      2
female_5      3      2      3      3      3

但我需要这个(只显示第一行)

male_1 male_2 male_3 male_4 male_5
female_1      1      1      3      2      3
.
.

实际上,我的数据集不对称(我有47个女性和32个男性) .

谢谢你的帮助!!!

2 回答

  • 1

    设置一个对象以接收结果:

    xy <- matrix(NA, nrow(females), nrow(males))
    for ( x in 1:nrow(females) ){
            for(y in 1:nrow(males) ){ 
                  xy[x,y] <- sum(females[x, 1:ncol(females)] != males[y,1:ncol(males)])}}
    

    应该也可以使用嵌套的sapply调用,因为不需要单独的“设置”,(因为只有一点点更清洁,与流行的神话相反,不是更快),可能会更清洁一些:

    xy <- sapply( 1:nrow(females) , 
                  function(x) sapply( 1:nrow(males) , 
                      function(y) sum( females[x, 1:ncol(females)] != males[y,1:ncol(males)]) ))
     xy
    #-----
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    3    2    1    1
    [2,]    1    1    4    1    3
    [3,]    3    5    0    3    1
    [4,]    2    2    3    0    2
    [5,]    3    5    0    3    1
    
    dimnames(xy) <- list( rownames(females), rownames(males) )
    
  • 0
    inverseCross <- function(females, males){ 
    inverse <- data.frame(a=integer(), b=integer(), c=integer(), d=integer(), e=integer()) 
    tempRow <- NULL
     for(i in 1:nrow(females)){
    for(j in 1:nrow(males)){
    sum <- 0
    for(k in 1: ncol(males)){
    if(females[i,k] != males[j,k]){
    sum <- sum + 1
    }
    }
    tempRow <- c(tempRow, sum)
    }
    inverse[i,] <- tempRow
    }
    colnames(inverse) <- rownames(males)
    rownames(inverse) <- rownames(females)  
    inverse
    }
    

相关问题