如何从TDM中删除NA列以进行群集

时间:2017-04-30 22:39:14

标签: r cluster-analysis term-document-matrix

我正在努力使用TDM NA值来提交群集。最初我设置了:

titles.tdm <- as.matrix(TermDocumentMatrix(titles.cw, control = list(bounds = list(global = c(10,Inf)))))

titles.sc <- scale(na.omit(titles.tdm))

获得了418个术语和6955个文档的矩阵。此时执行: titles.km <- kmeans(titles.sc, 2)抛出 Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)

当我决定删除这些值时:

titles.sf <- titles.sc[,colSums(titles.sc) > 0]

我已经获得了4695个文档的矩阵,但应用kmeans函数仍然会抛出此错误。当我查看titles.sf变量时,仍然存在具有NA值的列(docs)。我搞砸了,不知道做错了什么。如何删除这些文件?

之前,我已应用titles.cw <- titles.cc[which(str_trim(titles.cc$content) != "")] titles.cc来自tm库类的纯语料库对象,以删除黑色文档。它可能有效,但我的NA值是在文件中,当然不是空白。

1 个答案:

答案 0 :(得分:2)

以下是一些示例数据:

set.seed(123)
titles.sc <- matrix(1:25,5,5)
titles.sc[sample(length(titles.sc),5)]<-NA 
titles.sc
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    6   11   16   21
# [2,]    2    7   12   17   NA
# [3,]    3   NA   13   18   23
# [4,]    4    9   14   NA   24
# [5,]    5   NA   15   NA   25

kmeans会引发您的错误

kmeans(titles.sc, 2)
# Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)

因为您的列子集可能不是您所期望的那样:

colSums(titles.sc) > 0
# [1] TRUE   NA TRUE   NA   NA

colSums生成NA,如果未删除缺失值(请查看?colSums下的帮助文件)。除其他外,你可以做

colSums(is.na(titles.sc)) == 0
# [1]  TRUE FALSE  TRUE FALSE FALSE

!is.na(colSums(titles.sc) > 0)
# [1]  TRUE FALSE  TRUE FALSE FALSE

现在,它有效:

titles.sf <- titles.sc[,colSums(is.na(titles.sc)) == 0,drop=F]
kmeans(titles.sf,2)
# K-means clustering with 2 clusters of sizes 2, 3
# ...