2016-12-06 113 views
0

我有一些推文和其他变量,我想转换为稀疏矩阵。从推文创建稀疏矩阵

这基本上是我的数据看起来像。现在它被保存在data.table中,其中一列包含推文和一列包含分数。

Tweet    Score 
Sample Tweet :)  1 
Different Tweet  0 

我想这个转换成看起来像这样一个矩阵:

Score Sample Tweet Different :) 
    1  1  1   0 1 
    0  0  1   1 0 

凡在稀疏矩阵在我data.table每一行一行。在R中有这么简单的方法吗?

回答

1

你想

library(Matrix) 
words = unique(unlist(strsplit(dt[, Tweet], ' '))) 

M = Matrix(0, nrow = NROW(dt), ncol = length(words)) 
colnames(M) = words 

for(j in 1:length(words)){ 
    M[, j] = grepl(paste0('\\b', words[j], '\\b'), dt[, Tweet]) 
} 

M = cbind(M, as.matrix(dt[, setdiff(names(dt),'Tweet'), with=F])) 

#2 x 5 sparse Matrix of class "dgCMatrix" 
#  Sample Tweet :) Different Score 
#[1,]  1  1 .   .  1 
#[2,]  .  1 .   1  . 

唯一的小问题是什么这是接近的是,正则表达式是不承认':)'作为一个字。也许一个更了解正则表达式的人可以建议如何解决这个问题。

+0

顺便说一句我在上面使用data.table语法。确保你转换为数据,表使用代码原样。 – dww

+0

感谢您的回复。如果我在看这个权利,我们可以将grepl(paste0('\\ b',words [j],'\\ b'),dt [,Tweet])更改为grepl(单词[j],tweet $鸣叫)。它在测试场景中工作,但我不确定是否还有另一种场景,我没有考虑它会失败的情况。另外,如果这个变化稍微有些变化,我想要在稀疏矩阵中出现单词出现的频率。因此,如果“差异”被写入两次,稀疏矩阵将显示一个2.是否有一个简单的方法呢? – Kristofersen

+0

你不能只删除'\\ b'或者它会匹配另一个词的词。例如'帽'将匹配'那' – dww