2012-04-22 12 views
4

私はRのリスト関数の使用に慣れていません。これは私の最初の行列リストです。私は行列のリスト内の各行列から同じ列を削除しようとしていますが、Rでの索引付けでどのように動作するかわかりません。Rの行列リストの各行列から列を削除するには?

今はリストに8つの行列があります。各行列は[120,56]です。各マトリックスから 列17-40と49-56を削除したいと思います。したがって、私は[120、24]の8つの行列のリストで終わるだろう。ここで

は、私が持っている行列リストの例である:

MatrixList <- list(maxT = matrix(1:56, 120, 56, byrow = TRUE), 
     minT = matrix(1:56, 120, 56, byrow = TRUE), 
     meanT = matrix(1:56, 120, 56, byrow = TRUE), 
     rain24 = matrix(1:56, 120, 56, byrow = TRUE), 
     rain5d = matrix(1:56, 120, 56, byrow = TRUE), 
     maxT2 = matrix(1:56, 120, 56, byrow = TRUE), 
     minT2 = matrix(1:56, 120, 56, byrow = TRUE), 
     meanT2 = matrix(1:56, 120, 56, byrow = TRUE)) 

私はこれは単純な問題のように思える知っているが、私は初心者だとちょうどループの組み合わせを使用するかどうかはわからないと列を削除するための内部索引付け。私はむしろ、効率的にこれを行う方法を学びたいと思うのではなく、個々の行列ごとに個別に行い、リストを作成するのではなく、

ご協力いただければ幸いです。ありがとう!

答えて

7

しばしばそうであるように、@DWinは優れた答えを早くで取得します。ここでは私の単純な心が理解しやすい見つけ代替手段です。

あなたは[演算子を使用して、リストを横断するlapplyを使用して、標準のサブセットすることができます

[演算子を(@DWinが示唆するように)関数として使うのではなく、私は匿名のf lapplyの中で、あなたのリストの1つの要素を変換するために実行する操作とまったく同じように見えます(つまり、サブセットは1つのマトリックス):

mls <- lapply(MatrixList, function(x)x[-c(17:40, 49:56), ]) 
str(mls) 

List of 8 
$ maxT : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ... 
$ minT : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ... 
$ meanT : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ... 
$ rain24: int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ... 
$ rain5d: int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ... 
$ maxT2 : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ... 
$ minT2 : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ... 
$ meanT2: int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ... 
+0

この寄付に感謝します。 DWinには効果的な解決策がありましたが、あなたの答えは私の頭を包み込む方が簡単です。 – djhocking

+0

OPが私たちのソリューションが完全に同等であると理解していない場合、Rがどのように動作するかの理解を遅らせるだけです。 (そして、私はこれよりも速いと思っていますが、このサイズの問題は何も意味しません) –

+0

私はそれらが同等であることを理解していないわけではなく、私はまだabcのプログラミングのポイントにありますより効率的であっても、acプログラミングに飛びつくことは、より難しい課題です。私はそれがちょうど私がAndrieのソリューションのようなプログラミングを考える傾向があるという事実になると思う。そう言えば、私は "["でTRUE "トリック"を学ぶのはとてもうれしいです。だからこそ私は両方を支持した。再度、感謝します! – djhocking

6

lapplyは()を使用する機能や「トリック」である列削除するには、負のインデックスが続くすべての行を取得するには、最初の引数として「TRUE」を使用することです:

smallerMtx <- lapply(MatrixList, "[", TRUE, -c(17:40 , 49:56)) 
str(smallerMtx) 
#------------ 
List of 8 
$ maxT : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ... 
$ minT : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ... 
$ meanT : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ... 
$ rain24: int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ... 
$ rain5d: int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ... 
$ maxT2 : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ... 
$ minT2 : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ... 
$ meanT2: int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ... 

Iを実際に行や列を削除したいかどうかを解決する必要があると推測します。 (あなたは最初の文の列は後で行を言うように思ったが、例の数値部分は削除することを提案した列を要求したが、列が最初に指定されたプログラミングの伝統から来たのだろうか?

+0

素晴らしいです。 – djhocking

関連する問題