0

R に 2 つのテーブル (女性と男性) があり、存在と不在のデータがあります。各ペア間で共有されていないセルの数を見つけるために、それらの間でペアごとの比較を行いたいと思います(つまり、セルの合計は女性では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 人の男性がいます)。

助けてくれてありがとう!!!

4

2 に答える 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) )
于 2016-12-01T17:47:39.137 に答える
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
}
于 2016-12-01T18:14:54.327 に答える