6

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))

これは単純な問題のように思えますが、私は初心者であり、for ループと内部インデックスを組み合わせて列を削除する方法がわかりません。マトリックスごとに個別に実行してからリストを作成するのではなく、これを効率的に行う方法を学びたいと思います。

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

7

よくあることですが、@DWin は早い段階で優れた回答を提供してくれます。これは、私の単純な心が理解しやすい代替案です。

を使用lapplyしてリストをトラバースし、次に演算子を使用して標準のサブセット化を行うことができます[

演算子を関数として使用するのではなく(@DWin が提案するように)、リストの単一の要素を変換するために実行する操作とまったく同じように見える[無名関数を内部に記述することを好みます (つまり、単一の行列をサブセット化します)。lapply

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 ...
于 2012-04-22T20:02:17.273 に答える
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 ...

行または列を本当に削除するかどうかを決定する必要があると思います。(最初の文で列と言いましたが、後で行を言ったようです。例/リクエストの数値部分は列を削除することを提案しましたが、おそらく列が最初に指定されるプログラミングの伝統から来ています????

于 2012-04-22T20:00:09.473 に答える