1

私の問題は次のとおりです。

行列を減らしていくつかの列を切り取る必要がありますが、列ベクトルの名前は保持します。DTMは、次のような元のマトリックスです。

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

そして、「ラベル」を持ち、メンバーの合計がしきい値(たとえば2)未満のすべての列を削除する新しいマトリックス(次のコードチャンクのDTMr)を取得したいと思います。

   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は完璧ですが、すべてのラベル(word 1、... word 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の2番目の引数に配置して[それらの列のみを選択します。

そして、ベンがコメントで述べているように、これを行うに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 に答える