2014-10-16 136 views
1

我有话和文档中出现的输入选项卡表:从双列创建一个术语频矩阵出现矩阵

#  WORDS   DOCUMENTS 
1 chr1-1-5872   A_1 
2 chr1-5873-14436  A_2 
3 chr1-14437-17846  A_3 
4 chr1-17847-20294  A_2 
5 chr1-20295-22639  A_5 

而且我希望得到一个频率矩阵,在我所有的字作为行,所有的文件名作为列,每个条目是这个词找到了与此文档相关联的次数:

#      A_1 A_2 A_3 A_4 A_5 
1 chr1-1-5872   1  1 0  0  0 
2 chr1-5873-14436  0  0 0  0  0 
3 chr1-14437-17846  0  0 1  0  0 
4 chr1-17847-20294  0  1 0  0  0 
5 chr1-20295-22639  0  0 0  0  0 

我用下面的命令尝试:

result <- t(with(tab, wfm(tab$WODS, tab$DOCUMENTS))) 

但所有我得到的是

   A_1 A_2 A_3 A_5 
grouping.var 1 2 1 1 

我做错了什么? 如何根据要求获得我的矩阵行名?

+1

我觉得你忘记了一些重要的信息 – 2014-10-16 23:27:40

回答

2

我相信你正在使用qdap包。如果你的文本看起来像这样(即每一行实际上是一个单词),那么wfm是矫枉过正,你需要改变一堆参数以避免数据的剥离。你对重塑数据更感兴趣。这里有一个办法:

library(qdap) 
as.wfm(with(tab, mtabulate(setNames(DOCUMENTS, WORDS)))) 

##     A_1 A_2 A_3 A_5 
## chr1-1-5872  1 0 0 0 
## chr1-5873-14436 0 1 0 0 
## chr1-14437-17846 0 0 1 0 
## chr1-17847-20294 0 1 0 0 
## chr1-20295-22639 0 0 0 1 
4

使用table功能:

table(df) 
#     DOCUMENTS 
# WORDS    A_1 A_2 A_3 A_5 
# chr1-1-5872  1 0 0 0 
# chr1-14437-17846 0 0 1 0 
# chr1-17847-20294 0 1 0 0 
# chr1-20295-22639 0 0 0 1 
# chr1-5873-14436 0 1 0 0 

我们还可以添加as.data.frame.matrix有它data.frame类:

as.data.frame.matrix(table(df)) 
#     A_1 A_2 A_3 A_5 
# chr1-1-5872  1 0 0 0 
# chr1-14437-17846 0 0 1 0 
# chr1-17847-20294 0 1 0 0 
# chr1-20295-22639 0 0 0 1 
# chr1-5873-14436 0 1 0 0 

或者使用dcast(只是一般知识功能):

library(reshape2) 
dcast(df, WORDS ~ DOCUMENTS, length) 
#    WORDS A_1 A_2 A_3 A_5 
# 1  chr1-1-5872 1 0 0 0 
# 2 chr1-14437-17846 0 0 1 0 
# 3 chr1-17847-20294 0 1 0 0 
# 4 chr1-20295-22639 0 0 0 1 
# 5 chr1-5873-14436 0 1 0 0