2014-10-07 121 views
3

R新手。我正在嘗試創建一個包含水平數據的共生矩陣。我想知道哪些元素在行中共同出現'TRUE'。R共生矩陣水平數據

每一行代表一篇文章。每篇文章都有很多標記存在或缺乏元素的真/假變量。有100個元素,縮寫在這裏,超過10K的文章。所以一個10,000 x 101的數據幀。

dat <- read.table(text='"article"  "element1" "element2" "element3" "element4" 
1  "a house a home"  "TRUE" "TRUE" "FALSE" "FALSE" 
2  "cabin in the woods"  "TRUE" "TRUE" "FALSE" "FALSE" 
3  "motel is a hotel" "TRUE" "FALSE" "TRUE" "FALSE"', header=TRUE) 

我想在這個共發生問題(Creating co-occurrence matrix),但它似乎是因爲數據是不同的方式組織,即接近不會工作。

如果100個元素x 100個元素,則會有幫助的是矩陣。任何人都有建議?

回答

6

The sparse matrix answer在你鏈接的問題給出了一個快速,簡單的方法來做到這一點。你的數據結構(有點)更容易處理。

# Make a vector of all elements. 
elems <- colnames(dat)[-1] 
# Make a sparse matrix 
library(Matrix) 
s <- Matrix(as.matrix(dat[elems]), sparse=TRUE, dimnames=list(dat$article,elems)) 
# calculate co-occurrences 
(t(s) %*% s) 
# 4 x 4 sparse Matrix of class "dgCMatrix" 
#   element1 element2 element3 element4 
# element1  3  2  1  . 
# element2  2  2  .  . 
# element3  1  .  1  . 
# element4  .  .  .  . 

# If you don't want the exact number, and you want a "dense" matrix 
as.matrix((t(s) %*% s) >= 1) 
#   element1 element2 element3 element4 
# element1  TRUE  TRUE  TRUE FALSE 
# element2  TRUE  TRUE FALSE FALSE 
# element3  TRUE FALSE  TRUE FALSE 
# element4 FALSE FALSE FALSE FALSE 
4

這似乎相當快:

mat <- matrix(0,ncol=ncol(dat[-1]),nrow=ncol(dat[-1])) 
res <- combn(colnames(dat[-1]), 2, 
      FUN=function(x) sum(pmin(dat[x[1]],dat[x[2]])==1)) 
mat[lower.tri(mat)] <- res 
mat[upper.tri(mat)] <- res 
mat 

#  [,1] [,2] [,3] [,4] 
#[1,] 0 2 1 0 
#[2,] 2 0 0 0 
#[3,] 1 0 0 0 
#[4,] 0 0 0 0