我有一个单词和文档出现的输入标签表:
# 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
我做错了什么? 如何根据要求获取带行名的矩阵?
答案 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