2016-11-15 1 views
0

周波数データフレームから対称関係行列:両方の値がどこにあるかR:私はこのようなRの周波数を有するデータフレーム有する

V1 V2 V3 V4 
row1 1 2 0 1 
row2 0 6 0 3 
row3 3 0 0 0 
row4 0 0 2 0 
row5 4 1 0 0 
row6 3 0 1 1 
(more rows) 

a<-as.data.frame(matrix(c(1,2,0,1,0,6,0,3,3,0,0,0,0,0,2,0,4,1,0,0,3,0,1,1),byrow=T,ncol=4)) 

私は行ごとに、関数が計算するには、>列間の一致します0となるので、V1-V4の関係行列は次のようになります。

V1 V2 V3 V4 
V1 
V2 2 
V3 1 0 
V4 2 2 1 

便利な機能はありますか?それともどうすればいいですか?

答えて

1

combn,sapply、およびrowSumsを使用する基本R方式です。ここ

# get the pairwise combination of variables 
varComb <- combn(names(df), 2) 
varComb 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] "V1" "V1" "V1" "V2" "V2" "V3" 
[2,] "V2" "V3" "V4" "V3" "V4" "V4" 

# get the counts 
counts <- sapply(seq_len(ncol(varComb)), 
       function(i) sum(rowSums(df[,varComb[,i]] > 0) == 2)) 

、変数の組合せは、sumを使用して(値が0より大きいか否かを行が一緒にsumedされ、カウントさに基づいて論理マトリックスに変換されたデータフレームを、サブセットのに使用されます)を返します。sapplyは、このカウントをvarCombに存在するすべての変数のペアに適用することを可能にします。一緒にこれらの結果を置く

# put these into a data frame 
setNames(data.frame(t(varComb), counts), c("var1", "var2", "counts")) 
    var1 var2 counts 
1 V1 V2  2 
2 V1 V3  1 
3 V1 V4  2 
4 V2 V3  0 
5 V2 V4  2 
6 V3 V4  1 

、私たちは私たちがデータフレームを作成して、1行の変数に名前を適用することを可能にする、setNamesを使用することができます。

# construct empty matrix 
tempMat <- matrix(NA, 4, 4) 

# fill it in 
tempMat[cbind(as.integer(substr(dfNew$var2, 2, 2)), 
       as.integer(substr(dfNew$var1, 2, 2)))] <- dfNew$counts 

tempMat 
    [,1] [,2] [,3] [,4] 
[1,] NA NA NA NA 
[2,] 2 NA NA NA 
[3,] 1 0 NA NA 
[4,] 2 2 1 NA 

as.integersubstrcbindがにこの出力を変換し、値を配置している行と列を抽出します。行列には、この結果を置くため


、あなたはcbindと行列のサブセットを使用することができます行列サブセットに使用される行列。

+0

これはきちんとした考えですが、出力を行列として得る方法はありますか? – Zwentibold

0

オーケーは周りいじるのビットの後、ここで私が思い付いたものです:

a<-as.data.frame(matrix(c(1,2,0,1,0,6,0,3,3,0,0,0,0,0,2,0,4,1,0,0,3,0,1,1),byrow=T,ncol=4)) 
a[a>0]<-1 
a<-t(a)  
mat<-outer(1:nrow(a), 1:nrow(a), FUN=Vectorize(function(x,y) sum(a[x,]!=0 & a[y,]!=0))) 
mat[upper.tri(mat,diag=T)] <- 0 

ない、かなり、動作しているようです。

+1

バリエーション「t(a> 0)%*%(a> 0)* lower.tri(行列(、ncol(a)、ncol(a)))」もうまくいくようです。不等式の真/偽は、乗算において1/0として扱われる。 – Frank

関連する問題