R共生矩阵水平数据

时间:2014-10-07 22:32:54

标签: r matrix

R新手。我正在尝试使用水平数据创建共生矩阵。我想知道哪些元素共同出现' TRUE'一起排。

每行代表一篇文章。每篇文章都有许多标记元素存在与否的真/假变量。这里有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个元素,那么有用的将是矩阵。有人有建议吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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