3

これは、基本的にリスト構文を正しく理解することに関連する簡単なrの質問です。一連の行列をリストにロードして (いくつかの予備計算を行った後)、基本的なブロック平均化を実行したいと考えています。私の基本的なワークフローは次のようになります。

1)リスト内に含まれる各ベクトルを、平均化することに関心のあるブロックの数に対応する整数に丸めます。

2) リスト内の各ベクトルをこの新しい長さにパディングします。

3) リスト内の各行列を新しい行列に変換し、これに NA を無視して colmeans を適用します。

この非常に基本的なワークフローは、ここに示すベクトルの単純なアプローチに従います: http://www.cookbook-r.com/Manipulating_data/Averaging_a_sequence_in_blocks/

ただし、ベクトルだけでなく、ベクトルのリストがあります。たとえば、2 つのブロックの場合:

test1 <- list(a=c(1,2,3,4), b=c(2,4,6,8,10), c=c(3,6))
# Round up the length of vector the to the nearest 2
newlength <-  lapply(test1, function(x) {ceiling(length(x)/2)*2})

今私の問題に。これらがリスト外の行列である場合、通常は次のように長さを NA で埋めます。

test1[newlength] <- NA

しかし、これを lappy を使用して行う方法 (または同様の方法でしょうか?)。ここで構文を正しく考えていないことは明らかです。

lapply(test1, function(x) {x[newlength] <- NA})

これは明らかにエラーを返します:

Error in x[newlength] <- NA : invalid subscript type 'list'

リストの構文が正しくないためです。では、これを正しく行うにはどうすればよいですか?

最後にこれを行うための完全に良い方法がある場合に備えて、プロセスを終了するために、通常はベクトルに対して次のことを行います。

# Convert to a matrix with 2 rows
test1 <- matrix(test1, nrow=2)
# Take the means of the columns, and ignore any NA's
colMeans(test1, na.rm=TRUE)

最初にリスト環境を離れた方がよいでしょうか? リストの理由は、私には大きなデータセットがあり、リストを使用する方がよりエレガントなアプローチに思えたからです。ただし、提案やより論理的なアプローチにはオープンです。ありがとう。

4

2 に答える 2

4

あなたが望むように聞こえます:

mapply(function(x,y) {
     # x[y] <- NA # OP's proposed strategy
     length(x) <- y # Roland's better suggestion
     return(x)
     }, test1, newlength)
于 2013-07-23T08:06:44.830 に答える
2

問題を解決する方法はたくさんありますが、2 つの重要な改善点があると思います。1 つ目は、lapply() への 1 回の呼び出しでこれらすべてを行うことです。あなたが抱えているもう1つの主な問題は、エラーを返す関数()からの実際のreturn()値がないことです(申し訳ありませんが、タブレットでは、コピーして貼り付けるのが困難です)。それで、「x」をパディングしますが、 function() に何を返すように指示しますか? 何もない。

私があなたを正しく理解していれば、これらの両方を行う1つのソリューションを次に示します。

lapply(test1, function(x){
  newlength <- ceiling(length(x)/2)*2
  if(newlength!=length(x)){x[newlength] <- NA}
  colMeans(matrix(x, nrow=2), na.rm=TRUE)
})
于 2013-07-23T08:02:22.203 に答える