叉积的反面:如何从两个矩阵的交集创建一个新矩阵?
Opposite of cross-product: How to create a new matrix from the intersection of two matrices?
我在 R 中有两个表(女性和男性),其中包含存在-不存在数据。我想在它们之间进行成对比较(逐行)以找出每对之间未共享的细胞数量(即细胞总和在女性身上等于 1 但在男性身上不等于 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 名男性)。
感谢您的帮助!!!
设置对象接收结果:
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 调用,并且可能会更干净一些,因为不需要单独的 "setup",(但只是更干净一点,并且与流行的神话相反更快):
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) )
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
}
我在 R 中有两个表(女性和男性),其中包含存在-不存在数据。我想在它们之间进行成对比较(逐行)以找出每对之间未共享的细胞数量(即细胞总和在女性身上等于 1 但在男性身上不等于 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 名男性)。
感谢您的帮助!!!
设置对象接收结果:
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 调用,并且可能会更干净一些,因为不需要单独的 "setup",(但只是更干净一点,并且与流行的神话相反更快):
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) )
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
}