从双列出现矩阵创建一个术语 - 频率矩阵

时间:2014-10-16 23:19:24

标签: r matrix frequency

我有一个单词和文档出现的输入标签表:

#       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

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

2 个答案:

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

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