2016-11-15 161 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,sapplyrowSums的基本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)) 

這裏,變量組合用於子集的數據幀,這是基於該值是否是大於0的行被SUMED在一起並進行計數轉換爲一個邏輯矩陣(使用sum )根據結果是否等於2. 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 

把這些結果在一起,我們可以使用setNames,這使我們能夠創建一個數據幀,並在同一行申請名稱的變量。


把這一結果爲矩陣,你可以使用cbind和矩陣子集:

# 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.integersubstr提取行並在其中放置值的列,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(matrix(,ncol(a),ncol(a)))'似乎也適用。不等式的真/假在乘法中被視爲1/0。 – Frank