如何从 TDM 中删除 NA 列以进行聚类

how to remove NA columns from TDM for clustering

我正在努力使用 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 值的列(文档)。我搞砸了,不知道做错了什么。如何删除那些文件?

早些时候,我应用了 titles.cw <- titles.cc[which(str_trim(titles.cc$content) != "")],其中 titles.cc 是来自 tm 库 class 的纯语料库对象,用于删除黑色文档。它可能有效,但我的 NA 值在肯定不是空白的文档中。

下面是一些示例数据:

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
# ...