首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排除R中术语文档矩阵的colSums中的异常值

排除R中术语文档矩阵的colSums中的异常值
EN

Stack Overflow用户
提问于 2015-05-22 18:04:31
回答 1查看 213关注 0票数 1

我创建了一个术语文档矩阵,"myDtm",包含在大量专利集合中的一组关键字。我想获得一个有序的,种类前100名,与最高频率的关键字专利列表。

代码行为

代码语言:javascript
复制
myDtm <- TermDocumentMatrix(myCorpus, control = list(minWordLength = 1))
keywords <- unique(c("labor","cost","autom", "human" ,"person", "intens","reduc","machin","algorithm"))
inspect(myDtm[keywords,tail(order(colSums(v)),100)])

结果如下所示(摘录):

代码语言:javascript
复制
Terms       2435 33164 27276 1874 20447 41149 35987 21765 798 2461 19249 6822 27640
  labor        0     0     0    0     1     0     0     0   0    0     0    0     2
  cost        11     0     0    0    13     0     0     0   2    9     0    0     9
  autom        0     0     0    0    26     0     0     0   0    0     0    0     0
  human        0     0     0  270   150    16     0   279   0    0    54    0     1
  person       0    29     0    0    46     3     0     0   0    0     0    0     1
  intens       0     0     0    1     0     0     0     0   0    0     0    0    41
  reduc        8     0     8    9    13   289     2    12  12  305   292    0    44
  machin     264    77     0    0     2     0     0     2   0    0     0  323    31
  algorithm    0     0     8    0     0     0     1     0   2    0     0    0    95

问题是:如何排除异常值,就像6822号专利那样?对于异常值,我指的是只包含一个或两个关键字但频率非常高的专利。我想获得一个看起来像专利号20447或27640的专利的前100名的列表,其中包含了大多数关键字。更具体地说,有没有一种方法可以说:按关键词被提及的频率对专栏进行排序,并确保至少50%的关键词被提及??

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2015-05-22 18:18:18

下面排除了所有少于2个关键字的专利,并给出了一个数据帧,其中只包含存在2个以上关键字的剩余专利:

代码语言:javascript
复制
myDtm[ ,c(TRUE, sapply(myDtm[-1], function(x) sum(ifelse(x > 0, 1,0)) > 2))]

如果您只想对前100个行执行此操作,只需将上面的代码与行的筛选器(在您的OP代码中已有)结合使用,

如果您想要至少50%的关键字提及,您将必须执行以下操作:

代码语言:javascript
复制
myDtm[ ,c(TRUE, sapply(myDtm[-1], function(x) sum(ifelse(x > 0, 1,0))/length(x) > 0.5))]

或者等效地:

代码语言:javascript
复制
myDtm[ ,c(TRUE, sapply(myDtm[-1], function(x) mean(ifelse(x > 0, 1,0)) >= 0.5))]

或者用函数表示法:

代码语言:javascript
复制
cbind(myDtm[1], Filter(function(x) mean(ifelse(x > 0, 1, 0)) >= 0.5, myDtm[-1]))

如果您想检查频率计数,则创建一个新的df并生成一些箱图、汇总统计数据等(例如,1.5 * IQR四分位范围通常用作异常值的截止值):

代码语言:javascript
复制
table_Frequency_counts <- sapply(myDtm[-1], function(x) mean(ifelse(x > 0, 1, 0)))
boxplot(table_Frequency_counts)
summary(table_Frequency_counts)
1.5 * IQR(table_Frequency_counts)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30393851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档