【问题标题】:How to reduce a matrix without losing names of attributes in R如何减少矩阵而不丢失R中的属性名称
【发布时间】:2012-06-01 06:27:14
【问题描述】:

我的问题如下:

我需要减少一个矩阵,删除一些列,但保留列向量的名称。 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)。

有什么想法吗?

克劳迪奥

【问题讨论】:

  • 实际上,DTMr 并没有丢失任何东西:它从来没有得到标签...

标签: r matrix label bind reduce


【解决方案1】:

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

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

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

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

DTM[,colSums(DTM) > 2]

【讨论】:

  • 是的。 colSums() 会比apply(DTM,2,sum) 更快更紧凑
【解决方案2】:

使用子集和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

【讨论】:

  • 这是最简短、最可爱的答案
【解决方案3】:

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

(我只是在使用我身边的另一个矩阵)

> 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

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 2020-05-30
    • 2014-10-27
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2017-10-04
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多