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