1

我的问题如下:

我需要减少一个矩阵,删除一些列,但保留列向量的名称。DTM 是我的原始矩阵,如下所示:

>DTM
   word1    word2    word3    word4
[1] 1         1        0        0
[2] 2         0        1        1
[3] 0         1        0        2

我想获得一个具有“标签”的新矩阵(以下代码块中的 DTMr)并消除其成员总和小于阈值的所有列(例如 2):

   word1    word4
[1] 1         0
[2] 2         1
[3] 0         2

>DTMr <- matrix(,nrow=nrow(DTM),ncol=d) # This should be the reduced matrix

其中 d 是大于阈值的 DTM 的列数

>c = 1 # new counter
>for (col in 1:ncol(DTM))
>{
>  if (sum(DTM[,col]) > 2) 
>  { 
>    DTMr[,c] = DTM[,col]
>    
>    c=c+1
>  }
>}

不幸的是,DTMr 是完美的,但它丢失了所有标签(单词 1,...单词 n)。

有任何想法吗?

克劳迪奥

4

3 回答 3

3

使用子集和的简单解决方案colSums

创建一些示例数据:

set.seed(1)
x <- matrix(sample(0:2, 12, replace=TRUE), ncol=4)
colnames(x) <- LETTERS[1:4]
x
     A B C D
[1,] 0 2 2 0
[2,] 1 0 1 0
[3,] 1 2 1 0

子集:

x[, colSums(x)<4]
     A D
[1,] 0 0
[2,] 1 0
[3,] 1 0
于 2012-05-25T16:56:17.143 回答
2

只需使用apply和一些简单的索引:

DTM[,apply(DTM,2,sum) > 2]
     word1 word4
[1,]     1     0
[2,]     2     1
[3,]     0     2

稍微拆开包装,apply(DTM,2,sum)返回一个列和的向量。随后的布尔比较会产生一个布尔向量,当相应的列总和大于 2 时,该向量为 TRUE。最后,将这些全部放在[select 的第二个参数中。

正如 Ben 在评论中提到的那样,这colSums是一种更快(对于更大的矩阵)和更紧凑的方法:

DTM[,colSums(DTM) > 2]
于 2012-05-25T16:51:58.160 回答
0

如果您删除列而不是复制到没有属性的新矩阵,则会保留属性

(我只是使用我周围的另一个矩阵)

> m <- structure(c(26, 5, 21, 2, 2, 1, 0, 1, 1), 
                 .Dim = c(3L, 3L), 
                 .Dimnames = list(c("setosa", "versicolor", "virginica"), 
                                  c("PC1", "PC2", "PC3")))
> m
           PC1 PC2 PC3
setosa      26   2   0
versicolor   5   2   1
virginica   21   1   1

> colSums (m)
PC1 PC2 PC3 
52   5   2 

> m [, colSums (m) <= 2, drop = FALSE]
           PC3
setosa       0
versicolor   1
virginica    1
于 2012-05-25T17:09:25.980 回答